From b125dd455e563bf098d8d59d20202985b76103a9 Mon Sep 17 00:00:00 2001 From: Werner Schweer Date: Wed, 3 May 2006 12:42:25 +0000 Subject: initial import --- muse/.files, | 977 + muse/.mops, | 9 + muse/.qped | 30 + muse/AUTHORS | 0 muse/CMakeLists.txt | 165 + muse/COPYING | 340 + muse/ChangeLog | 2405 ++ muse/Doxyfile | 150 + muse/Doxyfile.in | 150 + muse/NEWS | 40 + muse/README | 76 + muse/Reference | 59 + muse/SECURITY | 244 + muse/TODO | 73 + muse/al/CMakeLists.txt | 14 + muse/al/al.cpp | 28 + muse/al/al.h | 33 + muse/al/marker.cpp | 86 + muse/al/marker.h | 67 + muse/al/pos.cpp | 581 + muse/al/pos.h | 128 + muse/al/sig.cpp | 407 + muse/al/sig.h | 103 + muse/al/tempo.cpp | 393 + muse/al/tempo.h | 100 + muse/al/xml.cpp | 344 + muse/al/xml.h | 62 + muse/all.h | 115 + muse/awl/CMakeLists.txt | 57 + muse/awl/aslider.cpp | 198 + muse/awl/aslider.h | 126 + muse/awl/awl.cpp | 27 + muse/awl/awl.h | 30 + muse/awl/awlplugin.cpp | 121 + muse/awl/awlplugin.h | 259 + muse/awl/checkbox.cpp | 36 + muse/awl/checkbox.h | 55 + muse/awl/clock.xpm | 24 + muse/awl/combobox.cpp | 36 + muse/awl/combobox.h | 55 + muse/awl/fastlog.h | 39 + muse/awl/floatentry.cpp | 317 + muse/awl/floatentry.h | 112 + muse/awl/knob.cpp | 281 + muse/awl/knob.h | 85 + muse/awl/metronom.xpm | 24 + muse/awl/midimeter.cpp | 139 + muse/awl/midimeter.h | 56 + muse/awl/midimslider.cpp | 139 + muse/awl/midimslider.h | 56 + muse/awl/midipanentry.cpp | 47 + muse/awl/midipanentry.h | 48 + muse/awl/midipanknob.cpp | 37 + muse/awl/midipanknob.h | 55 + muse/awl/midivolentry.cpp | 50 + muse/awl/midivolentry.h | 47 + muse/awl/mslider.cpp | 220 + muse/awl/mslider.h | 66 + muse/awl/panentry.cpp | 35 + muse/awl/panentry.h | 40 + muse/awl/panknob.cpp | 38 + muse/awl/panknob.h | 46 + muse/awl/pitchedit.cpp | 89 + muse/awl/pitchedit.h | 50 + muse/awl/pitchlabel.cpp | 106 + muse/awl/pitchlabel.h | 51 + muse/awl/posedit.cpp | 440 + muse/awl/posedit.h | 72 + muse/awl/poslabel.cpp | 100 + muse/awl/poslabel.h | 56 + muse/awl/sigedit.cpp | 223 + muse/awl/sigedit.h | 66 + muse/awl/slider.cpp | 248 + muse/awl/slider.h | 80 + muse/awl/tcanvas.cpp | 1799 ++ muse/awl/tcanvas.h | 253 + muse/awl/tempoedit.cpp | 88 + muse/awl/tempoedit.h | 55 + muse/awl/tempolabel.cpp | 72 + muse/awl/tempolabel.h | 48 + muse/awl/utils.cpp | 48 + muse/awl/utils.h | 29 + muse/awl/volentry.cpp | 37 + muse/awl/volentry.h | 41 + muse/awl/volknob.cpp | 39 + muse/awl/volknob.h | 46 + muse/awl/volslider.cpp | 54 + muse/awl/volslider.h | 52 + muse/cmake/UsePkgConfig1.cmake | 45 + muse/config.h | 22 + muse/config.h.in | 22 + muse/doc/README.CVS | 3 + muse/doc/README.de | 69 + muse/doc/README.instruments | 108 + muse/doc/README.ladspaguis | 63 + muse/doc/README.realtime | 37 + muse/doc/README.shortcuts | 159 + muse/doc/README.softsynth | 86 + muse/doc/README.translate | 62 + muse/doc/dimpl/dimpl.pdf | Bin 0 -> 166457 bytes muse/doc/dimpl/dimpl.tex | 773 + muse/doc/man/de/man-de.tex | 173 + muse/doc/man/en/man-en.tex | 302 + muse/doc/man/fdl.tex | 510 + muse/doc/man/gpl.tex | 318 + muse/doc/man/titlelogo.jpg | Bin 0 -> 15896 bytes muse/files | 907 + muse/gen | 17 + muse/grepmidi/CMakeLists.txt | 24 + muse/grepmidi/grepmidi | Bin 0 -> 17418 bytes muse/grepmidi/grepmidi.cpp | 348 + muse/midiplugins/filter/ctrlcombo.cpp | 56 + muse/midiplugins/filter/ctrlcombo.h | 24 + muse/midiplugins/filter/filter.cpp | 167 + muse/midiplugins/filter/filter.h | 51 + muse/midiplugins/filter/filterbase.ui | 269 + muse/midiplugins/filter/filtergui.cpp | 187 + muse/midiplugins/filter/filtergui.h | 57 + muse/midiplugins/libmidiplugin/evdata.h | 64 + muse/midiplugins/libmidiplugin/mempi.cpp | 81 + muse/midiplugins/libmidiplugin/mempi.h | 97 + muse/midiplugins/libmidiplugin/mpevent.cpp | 21 + muse/midiplugins/libmidiplugin/mpevent.h | 104 + muse/midiplugins/metronom/metronom.cpp | 167 + muse/midiplugins/metronom/metronom.h | 53 + muse/midiplugins/metronom/metronomgui.cpp | 75 + muse/midiplugins/metronom/metronomgui.h | 36 + muse/midiplugins/metronom/metronomgui.ui | 150 + muse/midiplugins/transform/transform.cpp | 904 + muse/midiplugins/transform/transform.h | 126 + muse/midiplugins/transform/transform.ui | 616 + muse/mops | 6 + muse/muse/.muse.bin.bak | Bin 0 -> 60813719 bytes muse/muse/CMakeLists.txt | 129 + muse/muse/DOC | 59 + muse/muse/aboutbox.ui | 413 + muse/muse/appearance.cpp | 647 + muse/muse/appearance.h | 73 + muse/muse/appearance.ui | 1182 + muse/muse/arranger/arranger.cpp | 1315 + muse/muse/arranger/arranger.h | 149 + muse/muse/arranger/canvas.cpp | 1045 + muse/muse/arranger/canvas.h | 101 + muse/muse/arranger/configtrack.cpp | 255 + muse/muse/arranger/configtrack.h | 49 + muse/muse/arranger/configtrack.ui | 313 + muse/muse/arranger/miditrackinfo.h | 34 + muse/muse/arranger/partdrag.cpp | 142 + muse/muse/arranger/partdrag.h | 59 + muse/muse/arranger/selectfilter.h | 39 + muse/muse/arranger/tllineedit.cpp | 58 + muse/muse/arranger/tllineedit.h | 36 + muse/muse/arranger/tlswidget.cpp | 376 + muse/muse/arranger/tlswidget.h | 77 + muse/muse/arranger/tlwidget.cpp | 621 + muse/muse/arranger/tlwidget.h | 93 + muse/muse/arranger/tlwlayout.cpp | 123 + muse/muse/arranger/tlwlayout.h | 39 + muse/muse/arranger/trackdrag.cpp | 49 + muse/muse/arranger/trackdrag.h | 30 + muse/muse/arranger/trackinfo.cpp | 717 + muse/muse/arranger/trackinfo.h | 214 + muse/muse/arranger/trelement.h | 52 + muse/muse/audio.cpp | 735 + muse/muse/audio.h | 289 + muse/muse/audioaux.cpp | 115 + muse/muse/audioaux.h | 50 + muse/muse/audiogroup.cpp | 47 + muse/muse/audiogroup.h | 46 + muse/muse/audioinput.cpp | 188 + muse/muse/audioinput.h | 59 + muse/muse/audiooutput.cpp | 222 + muse/muse/audiooutput.h | 68 + muse/muse/audioprefetch.cpp | 201 + muse/muse/audioprefetch.h | 54 + muse/muse/audiotrack.cpp | 565 + muse/muse/audiotrack.h | 94 + muse/muse/audiowriteback.cpp | 98 + muse/muse/audiowriteback.h | 44 + muse/muse/bench | 4 + muse/muse/cliplist/cliplist.cpp | 251 + muse/muse/cliplist/cliplist.h | 47 + muse/muse/cobject.cpp | 55 + muse/muse/cobject.h | 46 + muse/muse/conf.cpp | 716 + muse/muse/conf.h | 46 + muse/muse/configmidifile.ui | 153 + muse/muse/ctrl.cpp | 399 + muse/muse/ctrl.h | 221 + muse/muse/ctrl/CMakeLists.txt | 35 + muse/muse/ctrl/configmidictrl.cpp | 183 + muse/muse/ctrl/configmidictrl.h | 38 + muse/muse/ctrl/configmidictrl.ui | 228 + muse/muse/ctrl/ctrleditor.cpp | 412 + muse/muse/ctrl/ctrleditor.h | 52 + muse/muse/debug.h | 44 + muse/muse/default_click.h | 1213 + muse/muse/device.h | 56 + muse/muse/driver/CMakeLists.txt | 15 + muse/muse/driver/alsamidi.cpp | 698 + muse/muse/driver/alsamidi.h | 62 + muse/muse/driver/alsatimer.cpp | 188 + muse/muse/driver/alsatimer.h | 46 + muse/muse/driver/audiodev.h | 42 + muse/muse/driver/driver.h | 47 + muse/muse/driver/dummyaudio.cpp | 269 + muse/muse/driver/jack.cpp | 754 + muse/muse/driver/jackaudio.h | 70 + muse/muse/driver/posixtimer.cpp | 179 + muse/muse/driver/posixtimer.h | 39 + muse/muse/driver/rtctimer.cpp | 190 + muse/muse/driver/rtctimer.h | 39 + muse/muse/driver/timerdev.h | 39 + muse/muse/dssihost.cpp | 863 + muse/muse/dssihost.h | 129 + muse/muse/editor.cpp | 38 + muse/muse/editor.h | 44 + muse/muse/esettings.cpp | 773 + muse/muse/esettings.h | 361 + muse/muse/evdata.h | 76 + muse/muse/event.cpp | 198 + muse/muse/event.h | 146 + muse/muse/eventbase.h | 94 + muse/muse/eventlist.cpp | 93 + muse/muse/exportmidi.cpp | 379 + muse/muse/exportmidi.h | 41 + muse/muse/exportmididialog.ui | 176 + muse/muse/extmidieditor.cpp | 422 + muse/muse/extmidieditor.h | 120 + muse/muse/fastlog.h | 38 + muse/muse/fifo.cpp | 223 + muse/muse/fifo.h | 93 + muse/muse/gconfig.cpp | 139 + muse/muse/gconfig.h | 127 + muse/muse/genset.cpp | 475 + muse/muse/genset.h | 56 + muse/muse/genset.ui | 1320 + muse/muse/globaldefs.h | 39 + muse/muse/globals.cpp | 147 + muse/muse/globals.h | 101 + muse/muse/gui.h | 49 + muse/muse/help.cpp | 112 + muse/muse/help.h | 38 + muse/muse/helper.cpp | 47 + muse/muse/helper.h | 27 + muse/muse/icons.cpp | 555 + muse/muse/icons.h | 204 + muse/muse/importmidi.cpp | 437 + muse/muse/instruments/CMakeLists.txt | 46 + muse/muse/instruments/editinstrument.cpp | 119 + muse/muse/instruments/editinstrument.h | 35 + muse/muse/instruments/editinstrument.ui | 756 + muse/muse/instruments/midictrledit.cpp | 407 + muse/muse/instruments/midictrledit.h | 46 + muse/muse/instruments/minstrument.cpp | 482 + muse/muse/instruments/minstrument.h | 125 + muse/muse/ladspa.h | 599 + muse/muse/liste/CMakeLists.txt | 46 + muse/muse/liste/editctrlbase.ui | 288 + muse/muse/liste/editevent.cpp | 544 + muse/muse/liste/editevent.h | 152 + muse/muse/liste/editnotedialog.ui | 150 + muse/muse/liste/listedit.cpp | 1315 + muse/muse/liste/listedit.h | 214 + muse/muse/marker/CMakeLists.txt | 45 + muse/muse/marker/markerview.cpp | 391 + muse/muse/marker/markerview.h | 84 + muse/muse/master/CMakeLists.txt | 37 + muse/muse/master/master.cpp | 220 + muse/muse/master/master.h | 50 + muse/muse/master/masteredit.cpp | 287 + muse/muse/master/masteredit.h | 94 + muse/muse/midi.cpp | 779 + muse/muse/midi.h | 60 + muse/muse/midictrl.cpp | 323 + muse/muse/midictrl.h | 160 + muse/muse/midiedit/.Ped-tk | Bin 0 -> 1444 bytes muse/muse/midiedit/citem.cpp | 69 + muse/muse/midiedit/citem.h | 56 + muse/muse/midiedit/cmd.h | 19 + muse/muse/midiedit/ctrledit.cpp | 142 + muse/muse/midiedit/ctrledit.h | 64 + muse/muse/midiedit/dcanvas.cpp | 718 + muse/muse/midiedit/dcanvas.h | 71 + muse/muse/midiedit/drumedit.cpp | 496 + muse/muse/midiedit/drumedit.h | 84 + muse/muse/midiedit/drummap.cpp | 194 + muse/muse/midiedit/drummap.h | 68 + muse/muse/midiedit/ecanvas.cpp | 1546 ++ muse/muse/midiedit/ecanvas.h | 157 + muse/muse/midiedit/midieditor.cpp | 439 + muse/muse/midiedit/midieditor.h | 133 + muse/muse/midiedit/pianoroll.cpp | 644 + muse/muse/midiedit/pianoroll.h | 120 + muse/muse/midiedit/prcanvas.cpp | 841 + muse/muse/midiedit/prcanvas.h | 72 + muse/muse/midiedit/quantconfig.cpp | 56 + muse/muse/midiedit/quantconfig.h | 30 + muse/muse/midiedit/quantconfig.ui | 151 + muse/muse/midievent.cpp | 163 + muse/muse/midievent.h | 73 + muse/muse/midififo.cpp | 61 + muse/muse/midififo.h | 47 + muse/muse/midifile.cpp | 678 + muse/muse/midifile.h | 121 + muse/muse/midiplugin.cpp | 628 + muse/muse/midiplugin.h | 170 + muse/muse/midiport.cpp | 815 + muse/muse/midiport.h | 25 + muse/muse/midirc.cpp | 180 + muse/muse/midirc.h | 65 + muse/muse/midiseq.cpp | 549 + muse/muse/midiseq.h | 98 + muse/muse/midisynti.cpp | 237 + muse/muse/midisynti.h | 61 + muse/muse/miditrack.cpp | 615 + muse/muse/miditrack.h | 95 + muse/muse/miditransform.cpp | 1534 ++ muse/muse/miditransform.h | 113 + muse/muse/mixer/astrip.cpp | 1036 + muse/muse/mixer/astrip.h | 98 + muse/muse/mixer/midirack.cpp | 194 + muse/muse/mixer/midirack.h | 34 + muse/muse/mixer/mixer.cpp | 425 + muse/muse/mixer/mixer.h | 86 + muse/muse/mixer/mstrip.cpp | 1700 ++ muse/muse/mixer/mstrip.h | 204 + muse/muse/mixer/rack.cpp | 404 + muse/muse/mixer/rack.h | 49 + muse/muse/mixer/routedialog.cpp | 184 + muse/muse/mixer/routedialog.h | 41 + muse/muse/mixer/routedialog.ui | 170 + muse/muse/mixer/strip.cpp | 119 + muse/muse/mixer/strip.h | 57 + muse/muse/mpevent.cpp | 122 + muse/muse/mpevent.h | 118 + muse/muse/mtc.cpp | 131 + muse/muse/mtc.h | 68 + muse/muse/muse.cpp | 3048 +++ muse/muse/muse.h | 308 + muse/muse/muse.qrc | 19 + muse/muse/muse.ui | 87 + muse/muse/part.cpp | 551 + muse/muse/part.h | 147 + muse/muse/plugin.cpp | 875 + muse/muse/plugin.h | 341 + muse/muse/plugingui.cpp | 767 + muse/muse/plugingui.h | 122 + muse/muse/qrc_muse.cxx | 3836 +++ muse/muse/route.cpp | 504 + muse/muse/route.h | 77 + muse/muse/runmuse | 3 + muse/muse/seqmsg.cpp | 684 + muse/muse/shortcuts.cpp | 461 + muse/muse/shortcuts.h | 308 + muse/muse/song.cpp | 2355 ++ muse/muse/song.h | 399 + muse/muse/songfile.cpp | 427 + muse/muse/sync.cpp | 488 + muse/muse/sync.h | 41 + muse/muse/synth.cpp | 548 + muse/muse/synth.h | 217 + muse/muse/thread.cpp | 349 + muse/muse/thread.h | 109 + muse/muse/ticksynth.cpp | 181 + muse/muse/ticksynth.h | 29 + muse/muse/track.cpp | 971 + muse/muse/track.h | 604 + muse/muse/transport.cpp | 411 + muse/muse/transport.h | 74 + muse/muse/transport.ui | 856 + muse/muse/transpose.cpp | 92 + muse/muse/transpose.h | 40 + muse/muse/transpose.ui | 193 + muse/muse/undo.cpp | 550 + muse/muse/undo.h | 108 + muse/muse/value.cpp | 73 + muse/muse/vg | 4 + muse/muse/vst.cpp | 1057 + muse/muse/vst.h | 172 + muse/muse/wave.cpp | 869 + muse/muse/wave.h | 160 + muse/muse/waveedit/waveedit.cpp | 213 + muse/muse/waveedit/waveedit.h | 65 + muse/muse/waveedit/waveview.cpp | 799 + muse/muse/waveedit/waveview.h | 89 + muse/muse/waveevent.cpp | 133 + muse/muse/waveevent.h | 59 + muse/muse/wavetrack.cpp | 414 + muse/muse/wavetrack.h | 84 + muse/muse/widgets/.Ped-tk | Bin 0 -> 4000 bytes muse/muse/widgets/CMakeLists.txt | 85 + muse/muse/widgets/action.h | 29 + muse/muse/widgets/bigtime.cpp | 247 + muse/muse/widgets/bigtime.h | 44 + muse/muse/widgets/cliplisteditorbase.h | 138 + muse/muse/widgets/cliplisteditorbase.ui | 146 + muse/muse/widgets/comboQuant.cpp | 56 + muse/muse/widgets/comboQuant.h | 30 + muse/muse/widgets/combobox.cpp | 68 + muse/muse/widgets/combobox.h | 44 + muse/muse/widgets/comment.cpp | 78 + muse/muse/widgets/comment.h | 56 + muse/muse/widgets/comment.ui | 97 + muse/muse/widgets/ctrlcombo.cpp | 56 + muse/muse/widgets/ctrlcombo.h | 20 + muse/muse/widgets/dentry.cpp | 195 + muse/muse/widgets/dentry.h | 66 + muse/muse/widgets/doublelabel.cpp | 131 + muse/muse/widgets/doublelabel.h | 55 + muse/muse/widgets/editmetadialogbase.cpp | 110 + muse/muse/widgets/editmetadialogbase.ui | 137 + muse/muse/widgets/editsysexdialogbase.h | 203 + muse/muse/widgets/editsysexdialogbase.ui | 236 + muse/muse/widgets/fdialogbuttons.ui | 167 + muse/muse/widgets/fdialogbuttons1.h | 0 muse/muse/widgets/filedialog.cpp | 180 + muse/muse/widgets/filedialog.h | 52 + muse/muse/widgets/floatlabel.cpp | 131 + muse/muse/widgets/floatlabel.h | 55 + muse/muse/widgets/fontsel.cpp | 125 + muse/muse/widgets/fontsel.h | 44 + muse/muse/widgets/gatetime.cpp | 52 + muse/muse/widgets/gatetime.h | 37 + muse/muse/widgets/gatetime.ui | 210 + muse/muse/widgets/greendotbutton.h | 25 + muse/muse/widgets/intlabel.h | 43 + muse/muse/widgets/menutitle.cpp | 38 + muse/muse/widgets/menutitle.h | 29 + muse/muse/widgets/midisync.cpp | 116 + muse/muse/widgets/midisync.h | 37 + muse/muse/widgets/midisync.ui | 711 + muse/muse/widgets/mittransposebase.h | 111 + muse/muse/widgets/mittransposebase.ui | 112 + muse/muse/widgets/mixdowndialog.cpp | 107 + muse/muse/widgets/mixdowndialog.h | 35 + muse/muse/widgets/mixdowndialog.ui | 214 + muse/muse/widgets/mtrackinfobase.ui | 661 + muse/muse/widgets/noteinfo.cpp | 194 + muse/muse/widgets/noteinfo.h | 55 + muse/muse/widgets/outportcombo.cpp | 39 + muse/muse/widgets/outportcombo.h | 26 + muse/muse/widgets/quantcombo.cpp | 67 + muse/muse/widgets/quantcombo.h | 33 + muse/muse/widgets/rastercombo.cpp | 69 + muse/muse/widgets/rastercombo.h | 33 + muse/muse/widgets/recordbutton.h | 25 + muse/muse/widgets/shortcutcapturedialog.cpp | 88 + muse/muse/widgets/shortcutcapturedialog.h | 33 + muse/muse/widgets/shortcutcapturedialog.ui | 125 + muse/muse/widgets/shortcutconfig.cpp | 118 + muse/muse/widgets/shortcutconfig.h | 49 + muse/muse/widgets/shortcutconfig.ui | 202 + muse/muse/widgets/siglabel.cpp | 152 + muse/muse/widgets/siglabel.h | 37 + muse/muse/widgets/simplebutton.cpp | 37 + muse/muse/widgets/simplebutton.h | 28 + muse/muse/widgets/splitter.cpp | 94 + muse/muse/widgets/splitter.h | 49 + muse/muse/widgets/stutk9Nz | 0 muse/muse/widgets/synthwizardbase.h | 58 + muse/muse/widgets/tb1.cpp | 167 + muse/muse/widgets/tb1.h | 58 + muse/muse/widgets/tools.cpp | 119 + muse/muse/widgets/tools.h | 49 + muse/muse/widgets/transformbase.ui | 993 + muse/muse/widgets/utils.cpp | 384 + muse/muse/widgets/utils.h | 42 + muse/muse/widgets/velocity.cpp | 52 + muse/muse/widgets/velocity.h | 37 + muse/muse/widgets/velocity.ui | 211 + muse/muse/widgets/wtrackinfobase.ui | 166 + muse/muse/xpm/addtrack_addmiditrack.xpm | 26 + muse/muse/xpm/addtrack_audiogroup.xpm | 35 + muse/muse/xpm/addtrack_audioinput.xpm | 33 + muse/muse/xpm/addtrack_audiooutput.xpm | 44 + muse/muse/xpm/addtrack_auxsend.xpm | 28 + muse/muse/xpm/addtrack_drumtrack.xpm | 41 + muse/muse/xpm/addtrack_wavetrack.xpm | 36 + muse/muse/xpm/audio_bounce_to_file.xpm | 24 + muse/muse/xpm/audio_bounce_to_track.xpm | 27 + muse/muse/xpm/audio_restartaudio.xpm | 69 + muse/muse/xpm/automation_clear_data.xpm | 22 + muse/muse/xpm/automation_mixer.xpm | 35 + muse/muse/xpm/automation_take_snapshot.xpm | 144 + muse/muse/xpm/back.xpm | 27 + muse/muse/xpm/bluedot.xpm | 34 + muse/muse/xpm/bold.xpm | 16 + muse/muse/xpm/bouncetofile.xpm | 25 + muse/muse/xpm/buttondown.xpm | 27 + muse/muse/xpm/cafter.xpm | 29 + muse/muse/xpm/cliplistS.xpm | 28 + muse/muse/xpm/cmark.xpm | 23 + muse/muse/xpm/config.xpm | 36 + muse/muse/xpm/configure.xpm | 36 + muse/muse/xpm/context_help.xpm | 32 + muse/muse/xpm/ctrl.xpm | 27 + muse/muse/xpm/cut.xpm | 29 + muse/muse/xpm/darkgreendot.xpm | 19 + muse/muse/xpm/darkreddot.xpm | 17 + muse/muse/xpm/delete.xpm | 27 + muse/muse/xpm/dot.xpm | 22 + muse/muse/xpm/dot1.xpm | 22 + muse/muse/xpm/doth.xpm | 22 + muse/muse/xpm/down.xpm | 15 + muse/muse/xpm/draw.xpm | 25 + muse/muse/xpm/drumS.xpm | 30 + muse/muse/xpm/edit_drumms.xpm | 45 + muse/muse/xpm/edit_list.xpm | 31 + muse/muse/xpm/edit_mastertrack.xpm | 38 + muse/muse/xpm/edit_midi.xpm | 26 + muse/muse/xpm/edit_pianoroll.xpm | 28 + muse/muse/xpm/edit_score.xpm | 24 + muse/muse/xpm/edit_track_add.xpm | 24 + muse/muse/xpm/edit_track_del.xpm | 25 + muse/muse/xpm/editcopy.xpm | 102 + muse/muse/xpm/editcopyS.xpm | 26 + muse/muse/xpm/editcut.xpm | 33 + muse/muse/xpm/editcutS.xpm | 24 + muse/muse/xpm/editmute.xpm | 33 + muse/muse/xpm/editmuteS.xpm | 63 + muse/muse/xpm/editpaste.xpm | 210 + muse/muse/xpm/editpasteS.xpm | 27 + muse/muse/xpm/exit.xpm | 29 + muse/muse/xpm/exit1.xpm | 29 + muse/muse/xpm/exitS.xpm | 25 + muse/muse/xpm/fforward.xpm | 17 + muse/muse/xpm/filenew.png | Bin 0 -> 575 bytes muse/muse/xpm/filenewS.xpm | 29 + muse/muse/xpm/fileopen.png | Bin 0 -> 887 bytes muse/muse/xpm/fileopenS.xpm | 26 + muse/muse/xpm/fileprint.xpm | 102 + muse/muse/xpm/fileprintS.xpm | 26 + muse/muse/xpm/filesave.png | Bin 0 -> 762 bytes muse/muse/xpm/filesaveS.xpm | 28 + muse/muse/xpm/filesaveasS.xpm | 27 + muse/muse/xpm/find.xpm | 28 + muse/muse/xpm/flag.xpm | 28 + muse/muse/xpm/flagS.xpm | 19 + muse/muse/xpm/forward.xpm | 28 + muse/muse/xpm/frewind.xpm | 17 + muse/muse/xpm/glue.xpm | 49 + muse/muse/xpm/graydot.xpm | 21 + muse/muse/xpm/greendot.xpm | 18 + muse/muse/xpm/gv.xpm | 23 + muse/muse/xpm/home.xpm | 27 + muse/muse/xpm/idea.xpm | 35 + muse/muse/xpm/iiwusynth.xpm | 1372 + muse/muse/xpm/initS.xpm | 23 + muse/muse/xpm/inputpluginS.xpm | 22 + muse/muse/xpm/italic.xpm | 16 + muse/muse/xpm/listS.xpm | 26 + muse/muse/xpm/lmark.xpm | 23 + muse/muse/xpm/localoffS.xpm | 22 + muse/muse/xpm/lock.xpm | 86 + muse/muse/xpm/loop.xpm | 23 + muse/muse/xpm/loop1.xpm | 39 + muse/muse/xpm/master.xpm | 15 + muse/muse/xpm/mastertrackS.xpm | 25 + muse/muse/xpm/mastertrack_graphic.xpm | 28 + muse/muse/xpm/mastertrack_list.xpm | 27 + muse/muse/xpm/meta.xpm | 27 + muse/muse/xpm/midi_edit_instrument.xpm | 27 + muse/muse/xpm/midi_init_instr.xpm | 28 + muse/muse/xpm/midi_inputplugins.xpm | 33 + .../xpm/midi_inputplugins_midi_input_filter.xpm | 98 + .../xpm/midi_inputplugins_midi_input_transform.xpm | 31 + .../midi_inputplugins_random_rhythm_generator.xpm | 67 + muse/muse/xpm/midi_inputplugins_remote_control.xpm | 64 + muse/muse/xpm/midi_inputplugins_transpose.xpm | 30 + muse/muse/xpm/midi_local_off.xpm | 105 + muse/muse/xpm/midi_plugS.xpm | 22 + muse/muse/xpm/midi_reset_instr.xpm | 55 + muse/muse/xpm/midi_transform.xpm | 30 + muse/muse/xpm/midi_transpose.xpm | 31 + muse/muse/xpm/midiin.xpm | 23 + muse/muse/xpm/miditransformS.xpm | 22 + muse/muse/xpm/miditransposeS.xpm | 25 + muse/muse/xpm/minus.xpm | 24 + muse/muse/xpm/mixerS.xpm | 21 + muse/muse/xpm/mixeraudioS.xpm | 22 + muse/muse/xpm/mono.xpm | 16 + muse/muse/xpm/muse_icon.xpm | 411 + muse/muse/xpm/muse_icon_64x64.png | Bin 0 -> 7493 bytes muse/muse/xpm/mustangS.xpm | 23 + muse/muse/xpm/mute.xpm | 18 + muse/muse/xpm/mutebutton_off.xpm | 165 + muse/muse/xpm/mutebutton_on.xpm | 352 + muse/muse/xpm/newmutebutton.xpm | 69 + muse/muse/xpm/note.xpm | 23 + muse/muse/xpm/note1.xpm | 28 + muse/muse/xpm/off.xpm | 25 + muse/muse/xpm/pafter.xpm | 29 + muse/muse/xpm/panic.xpm | 50 + muse/muse/xpm/pencil.xpm | 27 + muse/muse/xpm/piano.xpm | 170 + muse/muse/xpm/pianoS.xpm | 24 + muse/muse/xpm/pitch.xpm | 28 + muse/muse/xpm/play.xpm | 17 + muse/muse/xpm/plus.xpm | 21 + muse/muse/xpm/pointer.xpm | 28 + muse/muse/xpm/punchin.xpm | 27 + muse/muse/xpm/punchin1.xpm | 18 + muse/muse/xpm/punchout.xpm | 24 + muse/muse/xpm/punchout1.xpm | 18 + muse/muse/xpm/quant.xpm | 28 + muse/muse/xpm/record.xpm | 160 + muse/muse/xpm/record1.xpm | 21 + muse/muse/xpm/record_off.xpm | 150 + muse/muse/xpm/record_on.xpm | 160 + muse/muse/xpm/reddot.xpm | 17 + muse/muse/xpm/redo.xpm | 92 + muse/muse/xpm/redoS.xpm | 25 + muse/muse/xpm/resetS.xpm | 22 + muse/muse/xpm/rmark.xpm | 23 + muse/muse/xpm/score.xpm | 170 + muse/muse/xpm/scoreS.xpm | 23 + muse/muse/xpm/select.xpm | 21 + muse/muse/xpm/select_all.xpm | 21 + muse/muse/xpm/select_all_parts_on_track.xpm | 39 + muse/muse/xpm/select_deselect_all.xpm | 22 + muse/muse/xpm/select_inside_loop.xpm | 21 + muse/muse/xpm/select_invert_selection.xpm | 21 + muse/muse/xpm/select_outside_loop.xpm | 21 + muse/muse/xpm/settings_appearance_settings.xpm | 66 + muse/muse/xpm/settings_configureshortcuts.xpm | 36 + muse/muse/xpm/settings_follow_song.xpm | 30 + muse/muse/xpm/settings_globalsettings.xpm | 89 + muse/muse/xpm/settings_metronome.xpm | 99 + muse/muse/xpm/settings_midifileexport.xpm | 30 + muse/muse/xpm/settings_midiport_softsynths.xpm | 29 + muse/muse/xpm/settings_midisync.xpm | 53 + muse/muse/xpm/solobutton.xpm | 39 + muse/muse/xpm/solobutton_off.xpm | 146 + muse/muse/xpm/solobutton_on.xpm | 300 + muse/muse/xpm/speaker.xpm | 23 + muse/muse/xpm/splash.png | Bin 0 -> 45374 bytes muse/muse/xpm/start.xpm | 17 + muse/muse/xpm/steprec.xpm | 24 + muse/muse/xpm/stereo.xpm | 14 + muse/muse/xpm/stick.xpm | 33 + muse/muse/xpm/stop.xpm | 17 + muse/muse/xpm/sysex.xpm | 27 + muse/muse/xpm/toc.xpm | 27 + muse/muse/xpm/track_add.xpm | 23 + muse/muse/xpm/track_delete.xpm | 23 + muse/muse/xpm/underlined.xpm | 16 + muse/muse/xpm/undo.xpm | 93 + muse/muse/xpm/undoS.xpm | 25 + muse/muse/xpm/up.xpm | 15 + muse/muse/xpm/view_bigtime_window.xpm | 22 + muse/muse/xpm/view_cliplist.xpm | 32 + muse/muse/xpm/view_marker.xpm | 37 + muse/muse/xpm/view_mixer.xpm | 26 + muse/muse/xpm/view_transport_window.xpm | 24 + muse/muse/xpm/wave.xpm | 33 + muse/packaging/muse_icon.png | Bin 0 -> 7493 bytes muse/packaging/muse_mdk.spec | 274 + muse/plugins/CMakeLists.txt | 22 + muse/plugins/freeverb/CMakeLists.txt | 32 + muse/plugins/freeverb/allpass.h | 50 + muse/plugins/freeverb/comb.h | 66 + muse/plugins/freeverb/denormals.h | 28 + muse/plugins/freeverb/freeverb.cpp | 166 + muse/plugins/freeverb/readme.txt | 147 + muse/plugins/freeverb/revmodel.cpp | 232 + muse/plugins/freeverb/revmodel.h | 79 + muse/plugins/freeverb/tuning.h | 60 + muse/share/CMakeLists.txt | 22 + muse/share/html/CMakeLists.txt | 24 + muse/share/html/COPYING.html | 353 + muse/share/html/button_bar.jpg | Bin 0 -> 13115 bytes muse/share/html/getting_started.html | 89 + muse/share/html/index.html | 62 + muse/share/html/installation.html | 64 + muse/share/html/invocation.html | 54 + muse/share/html/left_pane.jpg | Bin 0 -> 24599 bytes muse/share/html/main_window.jpg | Bin 0 -> 75510 bytes muse/share/html/main_window_track_info.jpg | Bin 0 -> 84636 bytes muse/share/html/right_pane.jpg | Bin 0 -> 34158 bytes muse/share/html/styles.css | 85 + muse/share/html/toc_.txt | 13 + muse/share/html/track_info.jpg | Bin 0 -> 14003 bytes muse/share/html/window_ref.html | 180 + muse/share/instruments/Access_Virus.idf | 1045 + muse/share/instruments/Alesis-Ion.idf | 731 + muse/share/instruments/Alesis-QS-78R.idf | 700 + muse/share/instruments/AlesisQS6.idf | 658 + muse/share/instruments/CMakeLists.txt | 22 + muse/share/instruments/Hammond_XB-1.idf | 88 + muse/share/instruments/MC303.idf | 528 + muse/share/instruments/MC505.idf | 560 + muse/share/instruments/Quasimidi-Sirius.idf | 735 + muse/share/instruments/Roland-E28.idf | 320 + muse/share/instruments/Roland-SCD70.idf | 1513 ++ muse/share/instruments/Roland-XP30.idf | 1592 ++ muse/share/instruments/Roland_FantomXR.idf | 1419 ++ muse/share/instruments/Roland_SRX-02.idf | 66 + muse/share/instruments/Roland_SRX-09.idf | 454 + muse/share/instruments/Waldorf_Microwave-I.idf | 141 + muse/share/instruments/Yamaha-P50m.idf | 75 + muse/share/instruments/Yamaha-P80.idf | 71 + muse/share/instruments/Yamaha-PSR275.idf | 585 + muse/share/instruments/Yamaha-PSR530.idf | 759 + muse/share/instruments/Yamaha-S90.idf | 4304 ++++ muse/share/instruments/ZynAdd-1_4.idf | 22 + muse/share/instruments/emuproteus2000.idf | 1088 + muse/share/instruments/gm.idf | 209 + muse/share/instruments/gs.idf | 236 + muse/share/instruments/ns5r.idf | 568 + muse/share/instruments/xg.idf | 623 + muse/share/locale/CMakeLists.txt | 22 + muse/share/locale/muse_de.qm | Bin 0 -> 3455 bytes muse/share/locale/muse_de.ts | 5290 ++++ muse/share/locale/muse_es.qm | Bin 0 -> 29832 bytes muse/share/locale/muse_es.ts | 8803 +++++++ muse/share/locale/muse_fr.qm | Bin 0 -> 25507 bytes muse/share/locale/muse_fr.ts | 7700 ++++++ muse/share/locale/muse_ru.qm | Bin 0 -> 38168 bytes muse/share/locale/muse_ru.ts | 5819 +++++ muse/share/locale/muse_sv_SE.qm | Bin 0 -> 42686 bytes muse/share/locale/muse_sv_SE.ts | 8484 +++++++ muse/share/plugins/1050.ui | 297 + muse/share/plugins/1436.ui | 1090 + muse/share/plugins/2142.ui | 525 + muse/share/plugins/CMakeLists.txt | 22 + muse/share/templates/CMakeLists.txt | 22 + muse/share/templates/audio.med | 329 + muse/share/templates/default.med | 132 + muse/share/templates/midiGM.med | 409 + muse/share/templates/monorecord.med | 430 + muse/share/templates/synti.med | 806 + muse/share/wallpapers/CMakeLists.txt | 22 + muse/share/wallpapers/gray.gif | Bin 0 -> 6699 bytes muse/share/wallpapers/gray_rock.gif | Bin 0 -> 23780 bytes muse/share/wallpapers/gray_stucco.gif | Bin 0 -> 20903 bytes muse/share/wallpapers/paper1.jpg | Bin 0 -> 1662 bytes muse/share/wallpapers/stone1.gif | Bin 0 -> 1252 bytes muse/synti/CMakeLists.txt | 32 + muse/synti/deicsonze/ARCH_ALIN | 24945 +++++++++++++++++++ muse/synti/deicsonze/CMakeLists.txt | 43 + muse/synti/deicsonze/README | 20 + muse/synti/deicsonze/SutulaBank.dei | 0 muse/synti/deicsonze/TODO | 15 + muse/synti/deicsonze/deicsonze.cpp | 2794 +++ muse/synti/deicsonze/deicsonze.h | 351 + muse/synti/deicsonze/deicsonzegui.cpp | 3601 +++ muse/synti/deicsonze/deicsonzegui.h | 453 + muse/synti/deicsonze/deicsonzegui.ui | 7752 ++++++ muse/synti/deicsonze/deicsonzepreset.cpp | 1171 + muse/synti/deicsonze/deicsonzepreset.h | 555 + muse/synti/deicsonze/pics/SHold.fig | 12 + muse/synti/deicsonze/pics/SHold.png | Bin 0 -> 394 bytes muse/synti/deicsonze/pics/algo1.fig | 31 + muse/synti/deicsonze/pics/algo1.png | Bin 0 -> 1010 bytes muse/synti/deicsonze/pics/algo2.fig | 29 + muse/synti/deicsonze/pics/algo2.png | Bin 0 -> 1840 bytes muse/synti/deicsonze/pics/algo3.fig | 29 + muse/synti/deicsonze/pics/algo3.png | Bin 0 -> 1841 bytes muse/synti/deicsonze/pics/algo4.fig | 29 + muse/synti/deicsonze/pics/algo4.png | Bin 0 -> 1952 bytes muse/synti/deicsonze/pics/algo5.fig | 34 + muse/synti/deicsonze/pics/algo5.png | Bin 0 -> 1542 bytes muse/synti/deicsonze/pics/algo6.fig | 37 + muse/synti/deicsonze/pics/algo6.png | Bin 0 -> 1672 bytes muse/synti/deicsonze/pics/algo7.fig | 35 + muse/synti/deicsonze/pics/algo7.png | Bin 0 -> 1623 bytes muse/synti/deicsonze/pics/algo8.fig | 34 + muse/synti/deicsonze/pics/algo8.png | Bin 0 -> 1631 bytes muse/synti/deicsonze/pics/sawUp.fig | 13 + muse/synti/deicsonze/pics/sawUp.png | Bin 0 -> 416 bytes muse/synti/deicsonze/pics/square.fig | 14 + muse/synti/deicsonze/pics/square.png | Bin 0 -> 354 bytes muse/synti/deicsonze/pics/triangl.fig | 13 + muse/synti/deicsonze/pics/triangl.png | Bin 0 -> 435 bytes muse/synti/deicsonze/pics/wave1.fig | 29 + muse/synti/deicsonze/pics/wave1.gnuplot | 2 + muse/synti/deicsonze/pics/wave1.png | Bin 0 -> 569 bytes muse/synti/deicsonze/pics/wave2.fig | 31 + muse/synti/deicsonze/pics/wave2.gnuplot | 2 + muse/synti/deicsonze/pics/wave2.png | Bin 0 -> 543 bytes muse/synti/deicsonze/pics/wave3.fig | 29 + muse/synti/deicsonze/pics/wave3.gnuplot | 2 + muse/synti/deicsonze/pics/wave3.png | Bin 0 -> 539 bytes muse/synti/deicsonze/pics/wave4.fig | 29 + muse/synti/deicsonze/pics/wave4.gnuplot | 2 + muse/synti/deicsonze/pics/wave4.png | Bin 0 -> 532 bytes muse/synti/deicsonze/pics/wave5.fig | 29 + muse/synti/deicsonze/pics/wave5.gnuplot | 2 + muse/synti/deicsonze/pics/wave5.png | Bin 0 -> 576 bytes muse/synti/deicsonze/pics/wave6.fig | 29 + muse/synti/deicsonze/pics/wave6.gnuplot | 2 + muse/synti/deicsonze/pics/wave6.png | Bin 0 -> 550 bytes muse/synti/deicsonze/pics/wave7.fig | 29 + muse/synti/deicsonze/pics/wave7.gnuplot | 2 + muse/synti/deicsonze/pics/wave7.png | Bin 0 -> 596 bytes muse/synti/deicsonze/pics/wave8.fig | 29 + muse/synti/deicsonze/pics/wave8.gnuplot | 2 + muse/synti/deicsonze/pics/wave8.png | Bin 0 -> 591 bytes muse/synti/fluid/CMakeLists.txt | 42 + muse/synti/fluid/fluid.cpp | 520 + muse/synti/fluid/fluid.h | 80 + muse/synti/fluid/fluidgui.cpp | 68 + muse/synti/fluid/fluidgui.h | 31 + muse/synti/fluid/fluidgui.ui | 115 + muse/synti/fluidsynth/CMakeLists.txt | 42 + muse/synti/fluidsynth/README.txt | 45 + muse/synti/fluidsynth/TODO | 13 + muse/synti/fluidsynth/fluidsynthgui.cpp | 596 + muse/synti/fluidsynth/fluidsynthgui.h | 136 + muse/synti/fluidsynth/fluidsynthgui.ui | 641 + muse/synti/fluidsynth/fluidsynti.cpp | 1174 + muse/synti/fluidsynth/fluidsynti.h | 142 + muse/synti/libsynti/CMakeLists.txt | 10 + muse/synti/libsynti/evdata.h | 66 + muse/synti/libsynti/gui.cpp | 130 + muse/synti/libsynti/gui.h | 72 + muse/synti/libsynti/mess.cpp | 122 + muse/synti/libsynti/mess.h | 97 + muse/synti/libsynti/mono.cpp | 47 + muse/synti/libsynti/mono.h | 47 + muse/synti/libsynti/mpevent.cpp | 21 + muse/synti/libsynti/mpevent.h | 55 + muse/synti/libsynti/poly.cpp | 35 + muse/synti/libsynti/poly.h | 39 + muse/synti/organ/CMakeLists.txt | 42 + muse/synti/organ/organ.cpp | 648 + muse/synti/organ/organ.h | 197 + muse/synti/organ/organgui.cpp | 123 + muse/synti/organ/organgui.h | 42 + muse/synti/organ/organgui.ui | 882 + muse/synti/s1/CMakeLists.txt | 27 + muse/synti/s1/s1.cpp | 158 + muse/synti/simpledrums/COPYING | 3 + muse/synti/simpledrums/README | 43 + muse/synti/simpledrums/ReleaseNotes.txt | 18 + muse/synti/simpledrums/common.h | 109 + muse/synti/simpledrums/simpledrums.cpp | 1650 ++ muse/synti/simpledrums/simpledrums.h | 171 + muse/synti/simpledrums/simpledrumsgui.cpp | 763 + muse/synti/simpledrums/simpledrumsgui.h | 199 + muse/synti/simpledrums/simpledrumsguibase.ui | 23 + muse/synti/simpledrums/ssplugin.cpp | 455 + muse/synti/simpledrums/ssplugin.h | 171 + muse/synti/simpledrums/sspluginchooserbase.ui | 106 + muse/synti/simpledrums/ssplugingui.cpp | 517 + muse/synti/simpledrums/ssplugingui.h | 198 + muse/synti/vam/CMakeLists.txt | 42 + muse/synti/vam/COPYING | 340 + muse/synti/vam/ChangeLog | 16 + muse/synti/vam/README | 42 + muse/synti/vam/TODO | 3 + muse/synti/vam/vam.cpp | 803 + muse/synti/vam/vam.h | 37 + muse/synti/vam/vamgui.cpp | 618 + muse/synti/vam/vamgui.h | 77 + muse/synti/vam/vamgui.ui | 1535 ++ 857 files changed, 236014 insertions(+) create mode 100644 muse/.files, create mode 100644 muse/.mops, create mode 100644 muse/.qped create mode 100644 muse/AUTHORS create mode 100644 muse/CMakeLists.txt create mode 100644 muse/COPYING create mode 100644 muse/ChangeLog create mode 100644 muse/Doxyfile create mode 100644 muse/Doxyfile.in create mode 100644 muse/NEWS create mode 100644 muse/README create mode 100644 muse/Reference create mode 100644 muse/SECURITY create mode 100644 muse/TODO create mode 100644 muse/al/CMakeLists.txt create mode 100644 muse/al/al.cpp create mode 100644 muse/al/al.h create mode 100644 muse/al/marker.cpp create mode 100644 muse/al/marker.h create mode 100644 muse/al/pos.cpp create mode 100644 muse/al/pos.h create mode 100644 muse/al/sig.cpp create mode 100644 muse/al/sig.h create mode 100644 muse/al/tempo.cpp create mode 100644 muse/al/tempo.h create mode 100644 muse/al/xml.cpp create mode 100644 muse/al/xml.h create mode 100644 muse/all.h create mode 100644 muse/awl/CMakeLists.txt create mode 100644 muse/awl/aslider.cpp create mode 100644 muse/awl/aslider.h create mode 100644 muse/awl/awl.cpp create mode 100644 muse/awl/awl.h create mode 100644 muse/awl/awlplugin.cpp create mode 100644 muse/awl/awlplugin.h create mode 100644 muse/awl/checkbox.cpp create mode 100644 muse/awl/checkbox.h create mode 100644 muse/awl/clock.xpm create mode 100644 muse/awl/combobox.cpp create mode 100644 muse/awl/combobox.h create mode 100644 muse/awl/fastlog.h create mode 100644 muse/awl/floatentry.cpp create mode 100644 muse/awl/floatentry.h create mode 100644 muse/awl/knob.cpp create mode 100644 muse/awl/knob.h create mode 100644 muse/awl/metronom.xpm create mode 100644 muse/awl/midimeter.cpp create mode 100644 muse/awl/midimeter.h create mode 100644 muse/awl/midimslider.cpp create mode 100644 muse/awl/midimslider.h create mode 100644 muse/awl/midipanentry.cpp create mode 100644 muse/awl/midipanentry.h create mode 100644 muse/awl/midipanknob.cpp create mode 100644 muse/awl/midipanknob.h create mode 100644 muse/awl/midivolentry.cpp create mode 100644 muse/awl/midivolentry.h create mode 100644 muse/awl/mslider.cpp create mode 100644 muse/awl/mslider.h create mode 100644 muse/awl/panentry.cpp create mode 100644 muse/awl/panentry.h create mode 100644 muse/awl/panknob.cpp create mode 100644 muse/awl/panknob.h create mode 100644 muse/awl/pitchedit.cpp create mode 100644 muse/awl/pitchedit.h create mode 100644 muse/awl/pitchlabel.cpp create mode 100644 muse/awl/pitchlabel.h create mode 100644 muse/awl/posedit.cpp create mode 100644 muse/awl/posedit.h create mode 100644 muse/awl/poslabel.cpp create mode 100644 muse/awl/poslabel.h create mode 100644 muse/awl/sigedit.cpp create mode 100644 muse/awl/sigedit.h create mode 100644 muse/awl/slider.cpp create mode 100644 muse/awl/slider.h create mode 100644 muse/awl/tcanvas.cpp create mode 100644 muse/awl/tcanvas.h create mode 100644 muse/awl/tempoedit.cpp create mode 100644 muse/awl/tempoedit.h create mode 100644 muse/awl/tempolabel.cpp create mode 100644 muse/awl/tempolabel.h create mode 100644 muse/awl/utils.cpp create mode 100644 muse/awl/utils.h create mode 100644 muse/awl/volentry.cpp create mode 100644 muse/awl/volentry.h create mode 100644 muse/awl/volknob.cpp create mode 100644 muse/awl/volknob.h create mode 100644 muse/awl/volslider.cpp create mode 100644 muse/awl/volslider.h create mode 100644 muse/cmake/UsePkgConfig1.cmake create mode 100644 muse/config.h create mode 100644 muse/config.h.in create mode 100644 muse/doc/README.CVS create mode 100644 muse/doc/README.de create mode 100644 muse/doc/README.instruments create mode 100644 muse/doc/README.ladspaguis create mode 100644 muse/doc/README.realtime create mode 100644 muse/doc/README.shortcuts create mode 100644 muse/doc/README.softsynth create mode 100644 muse/doc/README.translate create mode 100644 muse/doc/dimpl/dimpl.pdf create mode 100644 muse/doc/dimpl/dimpl.tex create mode 100644 muse/doc/man/de/man-de.tex create mode 100644 muse/doc/man/en/man-en.tex create mode 100644 muse/doc/man/fdl.tex create mode 100644 muse/doc/man/gpl.tex create mode 100644 muse/doc/man/titlelogo.jpg create mode 100644 muse/files create mode 100755 muse/gen create mode 100644 muse/grepmidi/CMakeLists.txt create mode 100755 muse/grepmidi/grepmidi create mode 100644 muse/grepmidi/grepmidi.cpp create mode 100644 muse/midiplugins/filter/ctrlcombo.cpp create mode 100644 muse/midiplugins/filter/ctrlcombo.h create mode 100644 muse/midiplugins/filter/filter.cpp create mode 100644 muse/midiplugins/filter/filter.h create mode 100644 muse/midiplugins/filter/filterbase.ui create mode 100644 muse/midiplugins/filter/filtergui.cpp create mode 100644 muse/midiplugins/filter/filtergui.h create mode 100644 muse/midiplugins/libmidiplugin/evdata.h create mode 100644 muse/midiplugins/libmidiplugin/mempi.cpp create mode 100644 muse/midiplugins/libmidiplugin/mempi.h create mode 100644 muse/midiplugins/libmidiplugin/mpevent.cpp create mode 100644 muse/midiplugins/libmidiplugin/mpevent.h create mode 100644 muse/midiplugins/metronom/metronom.cpp create mode 100644 muse/midiplugins/metronom/metronom.h create mode 100644 muse/midiplugins/metronom/metronomgui.cpp create mode 100644 muse/midiplugins/metronom/metronomgui.h create mode 100644 muse/midiplugins/metronom/metronomgui.ui create mode 100644 muse/midiplugins/transform/transform.cpp create mode 100644 muse/midiplugins/transform/transform.h create mode 100644 muse/midiplugins/transform/transform.ui create mode 100644 muse/mops create mode 100755 muse/muse/.muse.bin.bak create mode 100644 muse/muse/CMakeLists.txt create mode 100644 muse/muse/DOC create mode 100644 muse/muse/aboutbox.ui create mode 100644 muse/muse/appearance.cpp create mode 100644 muse/muse/appearance.h create mode 100644 muse/muse/appearance.ui create mode 100644 muse/muse/arranger/arranger.cpp create mode 100644 muse/muse/arranger/arranger.h create mode 100644 muse/muse/arranger/canvas.cpp create mode 100644 muse/muse/arranger/canvas.h create mode 100644 muse/muse/arranger/configtrack.cpp create mode 100644 muse/muse/arranger/configtrack.h create mode 100644 muse/muse/arranger/configtrack.ui create mode 100644 muse/muse/arranger/miditrackinfo.h create mode 100644 muse/muse/arranger/partdrag.cpp create mode 100644 muse/muse/arranger/partdrag.h create mode 100644 muse/muse/arranger/selectfilter.h create mode 100644 muse/muse/arranger/tllineedit.cpp create mode 100644 muse/muse/arranger/tllineedit.h create mode 100644 muse/muse/arranger/tlswidget.cpp create mode 100644 muse/muse/arranger/tlswidget.h create mode 100644 muse/muse/arranger/tlwidget.cpp create mode 100644 muse/muse/arranger/tlwidget.h create mode 100644 muse/muse/arranger/tlwlayout.cpp create mode 100644 muse/muse/arranger/tlwlayout.h create mode 100644 muse/muse/arranger/trackdrag.cpp create mode 100644 muse/muse/arranger/trackdrag.h create mode 100644 muse/muse/arranger/trackinfo.cpp create mode 100644 muse/muse/arranger/trackinfo.h create mode 100644 muse/muse/arranger/trelement.h create mode 100644 muse/muse/audio.cpp create mode 100644 muse/muse/audio.h create mode 100644 muse/muse/audioaux.cpp create mode 100644 muse/muse/audioaux.h create mode 100644 muse/muse/audiogroup.cpp create mode 100644 muse/muse/audiogroup.h create mode 100644 muse/muse/audioinput.cpp create mode 100644 muse/muse/audioinput.h create mode 100644 muse/muse/audiooutput.cpp create mode 100644 muse/muse/audiooutput.h create mode 100644 muse/muse/audioprefetch.cpp create mode 100644 muse/muse/audioprefetch.h create mode 100644 muse/muse/audiotrack.cpp create mode 100644 muse/muse/audiotrack.h create mode 100644 muse/muse/audiowriteback.cpp create mode 100644 muse/muse/audiowriteback.h create mode 100644 muse/muse/bench create mode 100644 muse/muse/cliplist/cliplist.cpp create mode 100644 muse/muse/cliplist/cliplist.h create mode 100644 muse/muse/cobject.cpp create mode 100644 muse/muse/cobject.h create mode 100644 muse/muse/conf.cpp create mode 100644 muse/muse/conf.h create mode 100644 muse/muse/configmidifile.ui create mode 100644 muse/muse/ctrl.cpp create mode 100644 muse/muse/ctrl.h create mode 100644 muse/muse/ctrl/CMakeLists.txt create mode 100644 muse/muse/ctrl/configmidictrl.cpp create mode 100644 muse/muse/ctrl/configmidictrl.h create mode 100644 muse/muse/ctrl/configmidictrl.ui create mode 100644 muse/muse/ctrl/ctrleditor.cpp create mode 100644 muse/muse/ctrl/ctrleditor.h create mode 100644 muse/muse/debug.h create mode 100644 muse/muse/default_click.h create mode 100644 muse/muse/device.h create mode 100644 muse/muse/driver/CMakeLists.txt create mode 100644 muse/muse/driver/alsamidi.cpp create mode 100644 muse/muse/driver/alsamidi.h create mode 100644 muse/muse/driver/alsatimer.cpp create mode 100644 muse/muse/driver/alsatimer.h create mode 100644 muse/muse/driver/audiodev.h create mode 100644 muse/muse/driver/driver.h create mode 100644 muse/muse/driver/dummyaudio.cpp create mode 100644 muse/muse/driver/jack.cpp create mode 100644 muse/muse/driver/jackaudio.h create mode 100644 muse/muse/driver/posixtimer.cpp create mode 100644 muse/muse/driver/posixtimer.h create mode 100644 muse/muse/driver/rtctimer.cpp create mode 100644 muse/muse/driver/rtctimer.h create mode 100644 muse/muse/driver/timerdev.h create mode 100644 muse/muse/dssihost.cpp create mode 100644 muse/muse/dssihost.h create mode 100644 muse/muse/editor.cpp create mode 100644 muse/muse/editor.h create mode 100644 muse/muse/esettings.cpp create mode 100644 muse/muse/esettings.h create mode 100644 muse/muse/evdata.h create mode 100644 muse/muse/event.cpp create mode 100644 muse/muse/event.h create mode 100644 muse/muse/eventbase.h create mode 100644 muse/muse/eventlist.cpp create mode 100644 muse/muse/exportmidi.cpp create mode 100644 muse/muse/exportmidi.h create mode 100644 muse/muse/exportmididialog.ui create mode 100644 muse/muse/extmidieditor.cpp create mode 100644 muse/muse/extmidieditor.h create mode 100644 muse/muse/fastlog.h create mode 100644 muse/muse/fifo.cpp create mode 100644 muse/muse/fifo.h create mode 100644 muse/muse/gconfig.cpp create mode 100644 muse/muse/gconfig.h create mode 100644 muse/muse/genset.cpp create mode 100644 muse/muse/genset.h create mode 100644 muse/muse/genset.ui create mode 100644 muse/muse/globaldefs.h create mode 100644 muse/muse/globals.cpp create mode 100644 muse/muse/globals.h create mode 100644 muse/muse/gui.h create mode 100644 muse/muse/help.cpp create mode 100644 muse/muse/help.h create mode 100644 muse/muse/helper.cpp create mode 100644 muse/muse/helper.h create mode 100644 muse/muse/icons.cpp create mode 100644 muse/muse/icons.h create mode 100644 muse/muse/importmidi.cpp create mode 100644 muse/muse/instruments/CMakeLists.txt create mode 100644 muse/muse/instruments/editinstrument.cpp create mode 100644 muse/muse/instruments/editinstrument.h create mode 100644 muse/muse/instruments/editinstrument.ui create mode 100644 muse/muse/instruments/midictrledit.cpp create mode 100644 muse/muse/instruments/midictrledit.h create mode 100644 muse/muse/instruments/minstrument.cpp create mode 100644 muse/muse/instruments/minstrument.h create mode 100644 muse/muse/ladspa.h create mode 100644 muse/muse/liste/CMakeLists.txt create mode 100644 muse/muse/liste/editctrlbase.ui create mode 100644 muse/muse/liste/editevent.cpp create mode 100644 muse/muse/liste/editevent.h create mode 100644 muse/muse/liste/editnotedialog.ui create mode 100644 muse/muse/liste/listedit.cpp create mode 100644 muse/muse/liste/listedit.h create mode 100644 muse/muse/marker/CMakeLists.txt create mode 100644 muse/muse/marker/markerview.cpp create mode 100644 muse/muse/marker/markerview.h create mode 100644 muse/muse/master/CMakeLists.txt create mode 100644 muse/muse/master/master.cpp create mode 100644 muse/muse/master/master.h create mode 100644 muse/muse/master/masteredit.cpp create mode 100644 muse/muse/master/masteredit.h create mode 100644 muse/muse/midi.cpp create mode 100644 muse/muse/midi.h create mode 100644 muse/muse/midictrl.cpp create mode 100644 muse/muse/midictrl.h create mode 100644 muse/muse/midiedit/.Ped-tk create mode 100644 muse/muse/midiedit/citem.cpp create mode 100644 muse/muse/midiedit/citem.h create mode 100644 muse/muse/midiedit/cmd.h create mode 100644 muse/muse/midiedit/ctrledit.cpp create mode 100644 muse/muse/midiedit/ctrledit.h create mode 100644 muse/muse/midiedit/dcanvas.cpp create mode 100644 muse/muse/midiedit/dcanvas.h create mode 100644 muse/muse/midiedit/drumedit.cpp create mode 100644 muse/muse/midiedit/drumedit.h create mode 100644 muse/muse/midiedit/drummap.cpp create mode 100644 muse/muse/midiedit/drummap.h create mode 100644 muse/muse/midiedit/ecanvas.cpp create mode 100644 muse/muse/midiedit/ecanvas.h create mode 100644 muse/muse/midiedit/midieditor.cpp create mode 100644 muse/muse/midiedit/midieditor.h create mode 100644 muse/muse/midiedit/pianoroll.cpp create mode 100644 muse/muse/midiedit/pianoroll.h create mode 100644 muse/muse/midiedit/prcanvas.cpp create mode 100644 muse/muse/midiedit/prcanvas.h create mode 100644 muse/muse/midiedit/quantconfig.cpp create mode 100644 muse/muse/midiedit/quantconfig.h create mode 100644 muse/muse/midiedit/quantconfig.ui create mode 100644 muse/muse/midievent.cpp create mode 100644 muse/muse/midievent.h create mode 100644 muse/muse/midififo.cpp create mode 100644 muse/muse/midififo.h create mode 100644 muse/muse/midifile.cpp create mode 100644 muse/muse/midifile.h create mode 100644 muse/muse/midiplugin.cpp create mode 100644 muse/muse/midiplugin.h create mode 100644 muse/muse/midiport.cpp create mode 100644 muse/muse/midiport.h create mode 100644 muse/muse/midirc.cpp create mode 100644 muse/muse/midirc.h create mode 100644 muse/muse/midiseq.cpp create mode 100644 muse/muse/midiseq.h create mode 100644 muse/muse/midisynti.cpp create mode 100644 muse/muse/midisynti.h create mode 100644 muse/muse/miditrack.cpp create mode 100644 muse/muse/miditrack.h create mode 100644 muse/muse/miditransform.cpp create mode 100644 muse/muse/miditransform.h create mode 100644 muse/muse/mixer/astrip.cpp create mode 100644 muse/muse/mixer/astrip.h create mode 100644 muse/muse/mixer/midirack.cpp create mode 100644 muse/muse/mixer/midirack.h create mode 100644 muse/muse/mixer/mixer.cpp create mode 100644 muse/muse/mixer/mixer.h create mode 100644 muse/muse/mixer/mstrip.cpp create mode 100644 muse/muse/mixer/mstrip.h create mode 100644 muse/muse/mixer/rack.cpp create mode 100644 muse/muse/mixer/rack.h create mode 100644 muse/muse/mixer/routedialog.cpp create mode 100644 muse/muse/mixer/routedialog.h create mode 100644 muse/muse/mixer/routedialog.ui create mode 100644 muse/muse/mixer/strip.cpp create mode 100644 muse/muse/mixer/strip.h create mode 100644 muse/muse/mpevent.cpp create mode 100644 muse/muse/mpevent.h create mode 100644 muse/muse/mtc.cpp create mode 100644 muse/muse/mtc.h create mode 100644 muse/muse/muse.cpp create mode 100644 muse/muse/muse.h create mode 100644 muse/muse/muse.qrc create mode 100644 muse/muse/muse.ui create mode 100644 muse/muse/part.cpp create mode 100644 muse/muse/part.h create mode 100644 muse/muse/plugin.cpp create mode 100644 muse/muse/plugin.h create mode 100644 muse/muse/plugingui.cpp create mode 100644 muse/muse/plugingui.h create mode 100644 muse/muse/qrc_muse.cxx create mode 100644 muse/muse/route.cpp create mode 100644 muse/muse/route.h create mode 100755 muse/muse/runmuse create mode 100644 muse/muse/seqmsg.cpp create mode 100644 muse/muse/shortcuts.cpp create mode 100644 muse/muse/shortcuts.h create mode 100644 muse/muse/song.cpp create mode 100644 muse/muse/song.h create mode 100644 muse/muse/songfile.cpp create mode 100644 muse/muse/sync.cpp create mode 100644 muse/muse/sync.h create mode 100644 muse/muse/synth.cpp create mode 100644 muse/muse/synth.h create mode 100644 muse/muse/thread.cpp create mode 100644 muse/muse/thread.h create mode 100644 muse/muse/ticksynth.cpp create mode 100644 muse/muse/ticksynth.h create mode 100644 muse/muse/track.cpp create mode 100644 muse/muse/track.h create mode 100644 muse/muse/transport.cpp create mode 100644 muse/muse/transport.h create mode 100644 muse/muse/transport.ui create mode 100644 muse/muse/transpose.cpp create mode 100644 muse/muse/transpose.h create mode 100644 muse/muse/transpose.ui create mode 100644 muse/muse/undo.cpp create mode 100644 muse/muse/undo.h create mode 100644 muse/muse/value.cpp create mode 100755 muse/muse/vg create mode 100644 muse/muse/vst.cpp create mode 100644 muse/muse/vst.h create mode 100644 muse/muse/wave.cpp create mode 100644 muse/muse/wave.h create mode 100644 muse/muse/waveedit/waveedit.cpp create mode 100644 muse/muse/waveedit/waveedit.h create mode 100644 muse/muse/waveedit/waveview.cpp create mode 100644 muse/muse/waveedit/waveview.h create mode 100644 muse/muse/waveevent.cpp create mode 100644 muse/muse/waveevent.h create mode 100644 muse/muse/wavetrack.cpp create mode 100644 muse/muse/wavetrack.h create mode 100644 muse/muse/widgets/.Ped-tk create mode 100644 muse/muse/widgets/CMakeLists.txt create mode 100644 muse/muse/widgets/action.h create mode 100644 muse/muse/widgets/bigtime.cpp create mode 100644 muse/muse/widgets/bigtime.h create mode 100644 muse/muse/widgets/cliplisteditorbase.h create mode 100644 muse/muse/widgets/cliplisteditorbase.ui create mode 100644 muse/muse/widgets/comboQuant.cpp create mode 100644 muse/muse/widgets/comboQuant.h create mode 100644 muse/muse/widgets/combobox.cpp create mode 100644 muse/muse/widgets/combobox.h create mode 100644 muse/muse/widgets/comment.cpp create mode 100644 muse/muse/widgets/comment.h create mode 100644 muse/muse/widgets/comment.ui create mode 100644 muse/muse/widgets/ctrlcombo.cpp create mode 100644 muse/muse/widgets/ctrlcombo.h create mode 100644 muse/muse/widgets/dentry.cpp create mode 100644 muse/muse/widgets/dentry.h create mode 100644 muse/muse/widgets/doublelabel.cpp create mode 100644 muse/muse/widgets/doublelabel.h create mode 100644 muse/muse/widgets/editmetadialogbase.cpp create mode 100644 muse/muse/widgets/editmetadialogbase.ui create mode 100644 muse/muse/widgets/editsysexdialogbase.h create mode 100644 muse/muse/widgets/editsysexdialogbase.ui create mode 100644 muse/muse/widgets/fdialogbuttons.ui create mode 100644 muse/muse/widgets/fdialogbuttons1.h create mode 100644 muse/muse/widgets/filedialog.cpp create mode 100644 muse/muse/widgets/filedialog.h create mode 100644 muse/muse/widgets/floatlabel.cpp create mode 100644 muse/muse/widgets/floatlabel.h create mode 100644 muse/muse/widgets/fontsel.cpp create mode 100644 muse/muse/widgets/fontsel.h create mode 100644 muse/muse/widgets/gatetime.cpp create mode 100644 muse/muse/widgets/gatetime.h create mode 100644 muse/muse/widgets/gatetime.ui create mode 100644 muse/muse/widgets/greendotbutton.h create mode 100644 muse/muse/widgets/intlabel.h create mode 100644 muse/muse/widgets/menutitle.cpp create mode 100644 muse/muse/widgets/menutitle.h create mode 100644 muse/muse/widgets/midisync.cpp create mode 100644 muse/muse/widgets/midisync.h create mode 100644 muse/muse/widgets/midisync.ui create mode 100644 muse/muse/widgets/mittransposebase.h create mode 100644 muse/muse/widgets/mittransposebase.ui create mode 100644 muse/muse/widgets/mixdowndialog.cpp create mode 100644 muse/muse/widgets/mixdowndialog.h create mode 100644 muse/muse/widgets/mixdowndialog.ui create mode 100644 muse/muse/widgets/mtrackinfobase.ui create mode 100644 muse/muse/widgets/noteinfo.cpp create mode 100644 muse/muse/widgets/noteinfo.h create mode 100644 muse/muse/widgets/outportcombo.cpp create mode 100644 muse/muse/widgets/outportcombo.h create mode 100644 muse/muse/widgets/quantcombo.cpp create mode 100644 muse/muse/widgets/quantcombo.h create mode 100644 muse/muse/widgets/rastercombo.cpp create mode 100644 muse/muse/widgets/rastercombo.h create mode 100644 muse/muse/widgets/recordbutton.h create mode 100644 muse/muse/widgets/shortcutcapturedialog.cpp create mode 100644 muse/muse/widgets/shortcutcapturedialog.h create mode 100644 muse/muse/widgets/shortcutcapturedialog.ui create mode 100644 muse/muse/widgets/shortcutconfig.cpp create mode 100644 muse/muse/widgets/shortcutconfig.h create mode 100644 muse/muse/widgets/shortcutconfig.ui create mode 100644 muse/muse/widgets/siglabel.cpp create mode 100644 muse/muse/widgets/siglabel.h create mode 100644 muse/muse/widgets/simplebutton.cpp create mode 100644 muse/muse/widgets/simplebutton.h create mode 100644 muse/muse/widgets/splitter.cpp create mode 100644 muse/muse/widgets/splitter.h create mode 100644 muse/muse/widgets/stutk9Nz create mode 100644 muse/muse/widgets/synthwizardbase.h create mode 100644 muse/muse/widgets/tb1.cpp create mode 100644 muse/muse/widgets/tb1.h create mode 100644 muse/muse/widgets/tools.cpp create mode 100644 muse/muse/widgets/tools.h create mode 100644 muse/muse/widgets/transformbase.ui create mode 100644 muse/muse/widgets/utils.cpp create mode 100644 muse/muse/widgets/utils.h create mode 100644 muse/muse/widgets/velocity.cpp create mode 100644 muse/muse/widgets/velocity.h create mode 100644 muse/muse/widgets/velocity.ui create mode 100644 muse/muse/widgets/wtrackinfobase.ui create mode 100644 muse/muse/xpm/addtrack_addmiditrack.xpm create mode 100644 muse/muse/xpm/addtrack_audiogroup.xpm create mode 100644 muse/muse/xpm/addtrack_audioinput.xpm create mode 100644 muse/muse/xpm/addtrack_audiooutput.xpm create mode 100644 muse/muse/xpm/addtrack_auxsend.xpm create mode 100644 muse/muse/xpm/addtrack_drumtrack.xpm create mode 100644 muse/muse/xpm/addtrack_wavetrack.xpm create mode 100644 muse/muse/xpm/audio_bounce_to_file.xpm create mode 100644 muse/muse/xpm/audio_bounce_to_track.xpm create mode 100644 muse/muse/xpm/audio_restartaudio.xpm create mode 100644 muse/muse/xpm/automation_clear_data.xpm create mode 100644 muse/muse/xpm/automation_mixer.xpm create mode 100644 muse/muse/xpm/automation_take_snapshot.xpm create mode 100644 muse/muse/xpm/back.xpm create mode 100644 muse/muse/xpm/bluedot.xpm create mode 100644 muse/muse/xpm/bold.xpm create mode 100644 muse/muse/xpm/bouncetofile.xpm create mode 100644 muse/muse/xpm/buttondown.xpm create mode 100644 muse/muse/xpm/cafter.xpm create mode 100644 muse/muse/xpm/cliplistS.xpm create mode 100644 muse/muse/xpm/cmark.xpm create mode 100644 muse/muse/xpm/config.xpm create mode 100644 muse/muse/xpm/configure.xpm create mode 100644 muse/muse/xpm/context_help.xpm create mode 100644 muse/muse/xpm/ctrl.xpm create mode 100644 muse/muse/xpm/cut.xpm create mode 100644 muse/muse/xpm/darkgreendot.xpm create mode 100644 muse/muse/xpm/darkreddot.xpm create mode 100644 muse/muse/xpm/delete.xpm create mode 100644 muse/muse/xpm/dot.xpm create mode 100644 muse/muse/xpm/dot1.xpm create mode 100644 muse/muse/xpm/doth.xpm create mode 100644 muse/muse/xpm/down.xpm create mode 100644 muse/muse/xpm/draw.xpm create mode 100644 muse/muse/xpm/drumS.xpm create mode 100644 muse/muse/xpm/edit_drumms.xpm create mode 100644 muse/muse/xpm/edit_list.xpm create mode 100644 muse/muse/xpm/edit_mastertrack.xpm create mode 100644 muse/muse/xpm/edit_midi.xpm create mode 100644 muse/muse/xpm/edit_pianoroll.xpm create mode 100644 muse/muse/xpm/edit_score.xpm create mode 100644 muse/muse/xpm/edit_track_add.xpm create mode 100644 muse/muse/xpm/edit_track_del.xpm create mode 100644 muse/muse/xpm/editcopy.xpm create mode 100644 muse/muse/xpm/editcopyS.xpm create mode 100644 muse/muse/xpm/editcut.xpm create mode 100644 muse/muse/xpm/editcutS.xpm create mode 100644 muse/muse/xpm/editmute.xpm create mode 100644 muse/muse/xpm/editmuteS.xpm create mode 100644 muse/muse/xpm/editpaste.xpm create mode 100644 muse/muse/xpm/editpasteS.xpm create mode 100644 muse/muse/xpm/exit.xpm create mode 100644 muse/muse/xpm/exit1.xpm create mode 100644 muse/muse/xpm/exitS.xpm create mode 100644 muse/muse/xpm/fforward.xpm create mode 100644 muse/muse/xpm/filenew.png create mode 100644 muse/muse/xpm/filenewS.xpm create mode 100644 muse/muse/xpm/fileopen.png create mode 100644 muse/muse/xpm/fileopenS.xpm create mode 100644 muse/muse/xpm/fileprint.xpm create mode 100644 muse/muse/xpm/fileprintS.xpm create mode 100644 muse/muse/xpm/filesave.png create mode 100644 muse/muse/xpm/filesaveS.xpm create mode 100644 muse/muse/xpm/filesaveasS.xpm create mode 100644 muse/muse/xpm/find.xpm create mode 100644 muse/muse/xpm/flag.xpm create mode 100644 muse/muse/xpm/flagS.xpm create mode 100644 muse/muse/xpm/forward.xpm create mode 100644 muse/muse/xpm/frewind.xpm create mode 100644 muse/muse/xpm/glue.xpm create mode 100644 muse/muse/xpm/graydot.xpm create mode 100644 muse/muse/xpm/greendot.xpm create mode 100644 muse/muse/xpm/gv.xpm create mode 100644 muse/muse/xpm/home.xpm create mode 100644 muse/muse/xpm/idea.xpm create mode 100644 muse/muse/xpm/iiwusynth.xpm create mode 100644 muse/muse/xpm/initS.xpm create mode 100644 muse/muse/xpm/inputpluginS.xpm create mode 100644 muse/muse/xpm/italic.xpm create mode 100644 muse/muse/xpm/listS.xpm create mode 100644 muse/muse/xpm/lmark.xpm create mode 100644 muse/muse/xpm/localoffS.xpm create mode 100644 muse/muse/xpm/lock.xpm create mode 100644 muse/muse/xpm/loop.xpm create mode 100644 muse/muse/xpm/loop1.xpm create mode 100644 muse/muse/xpm/master.xpm create mode 100644 muse/muse/xpm/mastertrackS.xpm create mode 100644 muse/muse/xpm/mastertrack_graphic.xpm create mode 100644 muse/muse/xpm/mastertrack_list.xpm create mode 100644 muse/muse/xpm/meta.xpm create mode 100644 muse/muse/xpm/midi_edit_instrument.xpm create mode 100644 muse/muse/xpm/midi_init_instr.xpm create mode 100644 muse/muse/xpm/midi_inputplugins.xpm create mode 100644 muse/muse/xpm/midi_inputplugins_midi_input_filter.xpm create mode 100644 muse/muse/xpm/midi_inputplugins_midi_input_transform.xpm create mode 100644 muse/muse/xpm/midi_inputplugins_random_rhythm_generator.xpm create mode 100644 muse/muse/xpm/midi_inputplugins_remote_control.xpm create mode 100644 muse/muse/xpm/midi_inputplugins_transpose.xpm create mode 100644 muse/muse/xpm/midi_local_off.xpm create mode 100644 muse/muse/xpm/midi_plugS.xpm create mode 100644 muse/muse/xpm/midi_reset_instr.xpm create mode 100644 muse/muse/xpm/midi_transform.xpm create mode 100644 muse/muse/xpm/midi_transpose.xpm create mode 100644 muse/muse/xpm/midiin.xpm create mode 100644 muse/muse/xpm/miditransformS.xpm create mode 100644 muse/muse/xpm/miditransposeS.xpm create mode 100644 muse/muse/xpm/minus.xpm create mode 100644 muse/muse/xpm/mixerS.xpm create mode 100644 muse/muse/xpm/mixeraudioS.xpm create mode 100644 muse/muse/xpm/mono.xpm create mode 100644 muse/muse/xpm/muse_icon.xpm create mode 100644 muse/muse/xpm/muse_icon_64x64.png create mode 100644 muse/muse/xpm/mustangS.xpm create mode 100644 muse/muse/xpm/mute.xpm create mode 100644 muse/muse/xpm/mutebutton_off.xpm create mode 100644 muse/muse/xpm/mutebutton_on.xpm create mode 100644 muse/muse/xpm/newmutebutton.xpm create mode 100644 muse/muse/xpm/note.xpm create mode 100644 muse/muse/xpm/note1.xpm create mode 100644 muse/muse/xpm/off.xpm create mode 100644 muse/muse/xpm/pafter.xpm create mode 100644 muse/muse/xpm/panic.xpm create mode 100644 muse/muse/xpm/pencil.xpm create mode 100644 muse/muse/xpm/piano.xpm create mode 100644 muse/muse/xpm/pianoS.xpm create mode 100644 muse/muse/xpm/pitch.xpm create mode 100644 muse/muse/xpm/play.xpm create mode 100644 muse/muse/xpm/plus.xpm create mode 100644 muse/muse/xpm/pointer.xpm create mode 100644 muse/muse/xpm/punchin.xpm create mode 100644 muse/muse/xpm/punchin1.xpm create mode 100644 muse/muse/xpm/punchout.xpm create mode 100644 muse/muse/xpm/punchout1.xpm create mode 100644 muse/muse/xpm/quant.xpm create mode 100644 muse/muse/xpm/record.xpm create mode 100644 muse/muse/xpm/record1.xpm create mode 100644 muse/muse/xpm/record_off.xpm create mode 100644 muse/muse/xpm/record_on.xpm create mode 100644 muse/muse/xpm/reddot.xpm create mode 100644 muse/muse/xpm/redo.xpm create mode 100644 muse/muse/xpm/redoS.xpm create mode 100644 muse/muse/xpm/resetS.xpm create mode 100644 muse/muse/xpm/rmark.xpm create mode 100644 muse/muse/xpm/score.xpm create mode 100644 muse/muse/xpm/scoreS.xpm create mode 100644 muse/muse/xpm/select.xpm create mode 100644 muse/muse/xpm/select_all.xpm create mode 100644 muse/muse/xpm/select_all_parts_on_track.xpm create mode 100644 muse/muse/xpm/select_deselect_all.xpm create mode 100644 muse/muse/xpm/select_inside_loop.xpm create mode 100644 muse/muse/xpm/select_invert_selection.xpm create mode 100644 muse/muse/xpm/select_outside_loop.xpm create mode 100644 muse/muse/xpm/settings_appearance_settings.xpm create mode 100644 muse/muse/xpm/settings_configureshortcuts.xpm create mode 100644 muse/muse/xpm/settings_follow_song.xpm create mode 100644 muse/muse/xpm/settings_globalsettings.xpm create mode 100644 muse/muse/xpm/settings_metronome.xpm create mode 100644 muse/muse/xpm/settings_midifileexport.xpm create mode 100644 muse/muse/xpm/settings_midiport_softsynths.xpm create mode 100644 muse/muse/xpm/settings_midisync.xpm create mode 100644 muse/muse/xpm/solobutton.xpm create mode 100644 muse/muse/xpm/solobutton_off.xpm create mode 100644 muse/muse/xpm/solobutton_on.xpm create mode 100644 muse/muse/xpm/speaker.xpm create mode 100644 muse/muse/xpm/splash.png create mode 100644 muse/muse/xpm/start.xpm create mode 100644 muse/muse/xpm/steprec.xpm create mode 100644 muse/muse/xpm/stereo.xpm create mode 100644 muse/muse/xpm/stick.xpm create mode 100644 muse/muse/xpm/stop.xpm create mode 100644 muse/muse/xpm/sysex.xpm create mode 100644 muse/muse/xpm/toc.xpm create mode 100644 muse/muse/xpm/track_add.xpm create mode 100644 muse/muse/xpm/track_delete.xpm create mode 100644 muse/muse/xpm/underlined.xpm create mode 100644 muse/muse/xpm/undo.xpm create mode 100644 muse/muse/xpm/undoS.xpm create mode 100644 muse/muse/xpm/up.xpm create mode 100644 muse/muse/xpm/view_bigtime_window.xpm create mode 100644 muse/muse/xpm/view_cliplist.xpm create mode 100644 muse/muse/xpm/view_marker.xpm create mode 100644 muse/muse/xpm/view_mixer.xpm create mode 100644 muse/muse/xpm/view_transport_window.xpm create mode 100644 muse/muse/xpm/wave.xpm create mode 100644 muse/packaging/muse_icon.png create mode 100755 muse/packaging/muse_mdk.spec create mode 100644 muse/plugins/CMakeLists.txt create mode 100644 muse/plugins/freeverb/CMakeLists.txt create mode 100644 muse/plugins/freeverb/allpass.h create mode 100644 muse/plugins/freeverb/comb.h create mode 100644 muse/plugins/freeverb/denormals.h create mode 100644 muse/plugins/freeverb/freeverb.cpp create mode 100644 muse/plugins/freeverb/readme.txt create mode 100644 muse/plugins/freeverb/revmodel.cpp create mode 100644 muse/plugins/freeverb/revmodel.h create mode 100644 muse/plugins/freeverb/tuning.h create mode 100644 muse/share/CMakeLists.txt create mode 100644 muse/share/html/CMakeLists.txt create mode 100644 muse/share/html/COPYING.html create mode 100644 muse/share/html/button_bar.jpg create mode 100644 muse/share/html/getting_started.html create mode 100644 muse/share/html/index.html create mode 100644 muse/share/html/installation.html create mode 100644 muse/share/html/invocation.html create mode 100644 muse/share/html/left_pane.jpg create mode 100644 muse/share/html/main_window.jpg create mode 100644 muse/share/html/main_window_track_info.jpg create mode 100644 muse/share/html/right_pane.jpg create mode 100644 muse/share/html/styles.css create mode 100644 muse/share/html/toc_.txt create mode 100644 muse/share/html/track_info.jpg create mode 100644 muse/share/html/window_ref.html create mode 100644 muse/share/instruments/Access_Virus.idf create mode 100644 muse/share/instruments/Alesis-Ion.idf create mode 100644 muse/share/instruments/Alesis-QS-78R.idf create mode 100644 muse/share/instruments/AlesisQS6.idf create mode 100644 muse/share/instruments/CMakeLists.txt create mode 100644 muse/share/instruments/Hammond_XB-1.idf create mode 100644 muse/share/instruments/MC303.idf create mode 100644 muse/share/instruments/MC505.idf create mode 100644 muse/share/instruments/Quasimidi-Sirius.idf create mode 100644 muse/share/instruments/Roland-E28.idf create mode 100644 muse/share/instruments/Roland-SCD70.idf create mode 100644 muse/share/instruments/Roland-XP30.idf create mode 100644 muse/share/instruments/Roland_FantomXR.idf create mode 100644 muse/share/instruments/Roland_SRX-02.idf create mode 100644 muse/share/instruments/Roland_SRX-09.idf create mode 100644 muse/share/instruments/Waldorf_Microwave-I.idf create mode 100644 muse/share/instruments/Yamaha-P50m.idf create mode 100644 muse/share/instruments/Yamaha-P80.idf create mode 100644 muse/share/instruments/Yamaha-PSR275.idf create mode 100644 muse/share/instruments/Yamaha-PSR530.idf create mode 100644 muse/share/instruments/Yamaha-S90.idf create mode 100644 muse/share/instruments/ZynAdd-1_4.idf create mode 100644 muse/share/instruments/emuproteus2000.idf create mode 100644 muse/share/instruments/gm.idf create mode 100644 muse/share/instruments/gs.idf create mode 100644 muse/share/instruments/ns5r.idf create mode 100644 muse/share/instruments/xg.idf create mode 100644 muse/share/locale/CMakeLists.txt create mode 100644 muse/share/locale/muse_de.qm create mode 100644 muse/share/locale/muse_de.ts create mode 100644 muse/share/locale/muse_es.qm create mode 100644 muse/share/locale/muse_es.ts create mode 100644 muse/share/locale/muse_fr.qm create mode 100644 muse/share/locale/muse_fr.ts create mode 100644 muse/share/locale/muse_ru.qm create mode 100644 muse/share/locale/muse_ru.ts create mode 100644 muse/share/locale/muse_sv_SE.qm create mode 100644 muse/share/locale/muse_sv_SE.ts create mode 100644 muse/share/plugins/1050.ui create mode 100644 muse/share/plugins/1436.ui create mode 100644 muse/share/plugins/2142.ui create mode 100644 muse/share/plugins/CMakeLists.txt create mode 100644 muse/share/templates/CMakeLists.txt create mode 100644 muse/share/templates/audio.med create mode 100644 muse/share/templates/default.med create mode 100644 muse/share/templates/midiGM.med create mode 100644 muse/share/templates/monorecord.med create mode 100644 muse/share/templates/synti.med create mode 100644 muse/share/wallpapers/CMakeLists.txt create mode 100644 muse/share/wallpapers/gray.gif create mode 100644 muse/share/wallpapers/gray_rock.gif create mode 100644 muse/share/wallpapers/gray_stucco.gif create mode 100644 muse/share/wallpapers/paper1.jpg create mode 100644 muse/share/wallpapers/stone1.gif create mode 100644 muse/synti/CMakeLists.txt create mode 100644 muse/synti/deicsonze/ARCH_ALIN create mode 100644 muse/synti/deicsonze/CMakeLists.txt create mode 100644 muse/synti/deicsonze/README create mode 100644 muse/synti/deicsonze/SutulaBank.dei create mode 100644 muse/synti/deicsonze/TODO create mode 100644 muse/synti/deicsonze/deicsonze.cpp create mode 100644 muse/synti/deicsonze/deicsonze.h create mode 100644 muse/synti/deicsonze/deicsonzegui.cpp create mode 100644 muse/synti/deicsonze/deicsonzegui.h create mode 100644 muse/synti/deicsonze/deicsonzegui.ui create mode 100644 muse/synti/deicsonze/deicsonzepreset.cpp create mode 100644 muse/synti/deicsonze/deicsonzepreset.h create mode 100644 muse/synti/deicsonze/pics/SHold.fig create mode 100644 muse/synti/deicsonze/pics/SHold.png create mode 100644 muse/synti/deicsonze/pics/algo1.fig create mode 100644 muse/synti/deicsonze/pics/algo1.png create mode 100644 muse/synti/deicsonze/pics/algo2.fig create mode 100644 muse/synti/deicsonze/pics/algo2.png create mode 100644 muse/synti/deicsonze/pics/algo3.fig create mode 100644 muse/synti/deicsonze/pics/algo3.png create mode 100644 muse/synti/deicsonze/pics/algo4.fig create mode 100644 muse/synti/deicsonze/pics/algo4.png create mode 100644 muse/synti/deicsonze/pics/algo5.fig create mode 100644 muse/synti/deicsonze/pics/algo5.png create mode 100644 muse/synti/deicsonze/pics/algo6.fig create mode 100644 muse/synti/deicsonze/pics/algo6.png create mode 100644 muse/synti/deicsonze/pics/algo7.fig create mode 100644 muse/synti/deicsonze/pics/algo7.png create mode 100644 muse/synti/deicsonze/pics/algo8.fig create mode 100644 muse/synti/deicsonze/pics/algo8.png create mode 100644 muse/synti/deicsonze/pics/sawUp.fig create mode 100644 muse/synti/deicsonze/pics/sawUp.png create mode 100644 muse/synti/deicsonze/pics/square.fig create mode 100644 muse/synti/deicsonze/pics/square.png create mode 100644 muse/synti/deicsonze/pics/triangl.fig create mode 100644 muse/synti/deicsonze/pics/triangl.png create mode 100644 muse/synti/deicsonze/pics/wave1.fig create mode 100644 muse/synti/deicsonze/pics/wave1.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave1.png create mode 100644 muse/synti/deicsonze/pics/wave2.fig create mode 100644 muse/synti/deicsonze/pics/wave2.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave2.png create mode 100644 muse/synti/deicsonze/pics/wave3.fig create mode 100644 muse/synti/deicsonze/pics/wave3.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave3.png create mode 100644 muse/synti/deicsonze/pics/wave4.fig create mode 100644 muse/synti/deicsonze/pics/wave4.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave4.png create mode 100644 muse/synti/deicsonze/pics/wave5.fig create mode 100644 muse/synti/deicsonze/pics/wave5.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave5.png create mode 100644 muse/synti/deicsonze/pics/wave6.fig create mode 100644 muse/synti/deicsonze/pics/wave6.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave6.png create mode 100644 muse/synti/deicsonze/pics/wave7.fig create mode 100644 muse/synti/deicsonze/pics/wave7.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave7.png create mode 100644 muse/synti/deicsonze/pics/wave8.fig create mode 100644 muse/synti/deicsonze/pics/wave8.gnuplot create mode 100644 muse/synti/deicsonze/pics/wave8.png create mode 100644 muse/synti/fluid/CMakeLists.txt create mode 100644 muse/synti/fluid/fluid.cpp create mode 100644 muse/synti/fluid/fluid.h create mode 100644 muse/synti/fluid/fluidgui.cpp create mode 100644 muse/synti/fluid/fluidgui.h create mode 100644 muse/synti/fluid/fluidgui.ui create mode 100644 muse/synti/fluidsynth/CMakeLists.txt create mode 100644 muse/synti/fluidsynth/README.txt create mode 100644 muse/synti/fluidsynth/TODO create mode 100644 muse/synti/fluidsynth/fluidsynthgui.cpp create mode 100644 muse/synti/fluidsynth/fluidsynthgui.h create mode 100644 muse/synti/fluidsynth/fluidsynthgui.ui create mode 100644 muse/synti/fluidsynth/fluidsynti.cpp create mode 100644 muse/synti/fluidsynth/fluidsynti.h create mode 100644 muse/synti/libsynti/CMakeLists.txt create mode 100644 muse/synti/libsynti/evdata.h create mode 100644 muse/synti/libsynti/gui.cpp create mode 100644 muse/synti/libsynti/gui.h create mode 100644 muse/synti/libsynti/mess.cpp create mode 100644 muse/synti/libsynti/mess.h create mode 100644 muse/synti/libsynti/mono.cpp create mode 100644 muse/synti/libsynti/mono.h create mode 100644 muse/synti/libsynti/mpevent.cpp create mode 100644 muse/synti/libsynti/mpevent.h create mode 100644 muse/synti/libsynti/poly.cpp create mode 100644 muse/synti/libsynti/poly.h create mode 100644 muse/synti/organ/CMakeLists.txt create mode 100644 muse/synti/organ/organ.cpp create mode 100644 muse/synti/organ/organ.h create mode 100644 muse/synti/organ/organgui.cpp create mode 100644 muse/synti/organ/organgui.h create mode 100644 muse/synti/organ/organgui.ui create mode 100644 muse/synti/s1/CMakeLists.txt create mode 100644 muse/synti/s1/s1.cpp create mode 100644 muse/synti/simpledrums/COPYING create mode 100644 muse/synti/simpledrums/README create mode 100644 muse/synti/simpledrums/ReleaseNotes.txt create mode 100644 muse/synti/simpledrums/common.h create mode 100644 muse/synti/simpledrums/simpledrums.cpp create mode 100644 muse/synti/simpledrums/simpledrums.h create mode 100644 muse/synti/simpledrums/simpledrumsgui.cpp create mode 100644 muse/synti/simpledrums/simpledrumsgui.h create mode 100644 muse/synti/simpledrums/simpledrumsguibase.ui create mode 100644 muse/synti/simpledrums/ssplugin.cpp create mode 100644 muse/synti/simpledrums/ssplugin.h create mode 100644 muse/synti/simpledrums/sspluginchooserbase.ui create mode 100644 muse/synti/simpledrums/ssplugingui.cpp create mode 100644 muse/synti/simpledrums/ssplugingui.h create mode 100644 muse/synti/vam/CMakeLists.txt create mode 100644 muse/synti/vam/COPYING create mode 100644 muse/synti/vam/ChangeLog create mode 100644 muse/synti/vam/README create mode 100644 muse/synti/vam/TODO create mode 100644 muse/synti/vam/vam.cpp create mode 100644 muse/synti/vam/vam.h create mode 100644 muse/synti/vam/vamgui.cpp create mode 100644 muse/synti/vam/vamgui.h create mode 100644 muse/synti/vam/vamgui.ui 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 @@ + + + + + + + + /home/ws/projects/muse/svn/trunk/muse/files + 0 + 78 + 0 + 1 + + 1 + + + + /home/ws/projects/muse/svn/trunk/muse/mops + 26 + 2 + 0 + 2 + + + + Make + 0 + 1 + + diff --git a/muse/AUTHORS b/muse/AUTHORS new file mode 100644 index 00000000..e69de29b 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. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 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. + + , 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 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 + 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 + 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 Jrn Nettingsmeier + +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 (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 (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 > { + public: + Marker* add(const Marker& m); + Marker* add(const QString& s, const Pos&); + void write(Xml&) const; + void remove(Marker*); + }; + +typedef std::multimap >::iterator iMarker; +typedef std::multimap >::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 (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 (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 (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 (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 > 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 (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 (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 (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 (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 > 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 << "\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 << "' << 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 << "\n"; + } + +void Xml::floatTag(const char* name, float val) + { + putLevel(); + *this << QString("<%1>%2\n").arg(name).arg(val).arg(name); + } + +void Xml::doubleTag(const char* name, double val) + { + putLevel(); + QString s("<%1>%2\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 << "&"; + break; + case '<': + *this << "<"; + break; + case '>': + *this << ">"; + break; + case '"': + *this << """; + break; + case '\'': + *this << "'"; + break; + default: + *this << *val; + break; + } + ++val; + } + } + *this << "\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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 +#include + +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 AwlPlugins::customWidgets() const + { + QList 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 + +//--------------------------------------------------------- +// 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 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 . + */ + +#ifndef __FASTLOG_H__ +#define __FASTLOG_H__ + +#include /* 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 + +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 meterval; + std::vector 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(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(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(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(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). +Fr Einzelheiten siehe COPYING. + +,-----------------------------------------------------------------. +| HINWEIS | +|-----------------------------------------------------------------| +| Viel Teile des Codes von MusE sind EXPERIMENTELL und knnen | +| zu Programmabstrzen und wer wei was sonst noch allem | +| fhren. | +| 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" fr minimales timing-jitter wren 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) + + - natrlich: eine Soundkarte und/oder irgendwelche Midi Gerte + + ============================= + Kompilierung + ============================= + + - download source von http://lmuse.sourceforge.net/ + - untar source: + tar xvofj muse-current-tar.bz2 + - 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: +------------------------------------------------- + + + + + + ...MusE event list which initializes instrument + + + + + ... + + + + + + ... + + 0x4a + 0 + 127 + 0 + + ... + + + +------------------------------------------------- + Notes +------------------------------------------------- + + (1) PatchGroups are not mandatory; its valid to write: + + + + + + + ... + + + (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: + + + (5) A patch can be associated with a "mode" with one of + + 1 - GM + 2 - GS + 4 - XG + + Example: + + + Mode id's can be ore'd together for patches which are valid + for more than one mode: + + + + (4) example for MusE event (Sysex "XG-On"): + + + 43 10 4c 00 00 7e 00 + + + (5) ... 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 + + + +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 + found soft synth + found 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 Hanappes + 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 Binary files /dev/null and b/muse/doc/dimpl/dimpl.pdf 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 + + + + + ...MusE event list which initializes instrument + + + + + ... + + + + + + ... + + 0x4a + 0 + 127 + 0 + + ... + + +\stoptyping + \blank + + PatchGroups\index{PatchGroups} are not mandatory; its valid to write: + + \blank +\starttyping + + + + + + ... + +\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 + + \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 + + \stoptyping + \blank + + Mode id's can be ore'd together for patches which are valid + for more than one mode: + + \blank + \starttyping + + \stoptyping + \blank + + example for MusE event (Sysex "XG-On"): + + \blank + \starttyping + + 43 10 4c 00 00 7e 00 + + \stoptyping + \blank + + \type{ ... } 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{Einfhrung} + \section{Was ist \M?} + \M\ ist ein ein "open source" Programm, verffentlicht 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 } + + \definedescription[Mops][location=left,headstyle=bold] + + \Mops{\tt :} + see below for a list of available options. + \Mops{\tt :} + 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 Binary files /dev/null and b/muse/doc/man/titlelogo.jpg 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 Binary files /dev/null and b/muse/grepmidi/grepmidi 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 +#include +#include +#include + +#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 @@ + + + + + FilterBase + + + + 0 + 0 + 388 + 213 + + + + + 3 + 5 + 0 + 0 + + + + MusE: Midi Input Filter + + + + 6 + + + 2 + + + + + + 5 + 5 + 0 + 0 + + + + Event Filter + + + + 6 + + + 2 + + + + + + 5 + 0 + 0 + 0 + + + + Note On + + + + + + + + 5 + 0 + 0 + 0 + + + + Poly Pressure + + + + + + + + 5 + 0 + 0 + 0 + + + + Controller + + + + + + + + 1 + 0 + 0 + 0 + + + + Program Change + + + + + + + + 5 + 0 + 0 + 0 + + + + After Touch + + + + + + + + 5 + 0 + 0 + 0 + + + + Pitch Bend + + + + + + + + 5 + 0 + 0 + 0 + + + + Sysex + + + + + + + + + + + 5 + 5 + 0 + 0 + + + + Controller Filter + + + + 6 + + + 2 + + + + + + 5 + 0 + 0 + 0 + + + + + + + + + 5 + 0 + 0 + 0 + + + + + + + + + 5 + 0 + 0 + 0 + + + + + + + + + 5 + 5 + 0 + 0 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + CtrlComboBox + QComboBox +
ctrlcombo.h
+ 0 + +
+
+ + rf1 + rf2 + rf3 + rf4 + rf5 + rf6 + rf7 + + + +
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 +#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 +#include "evdata.h" +#include + +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, +// __gnu_cxx::__mt_alloc > MPEL; + +typedef std::multiset > 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 > MREL; + +typedef std::list 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 @@ + + + + + MetronomBase + + + + 0 + 0 + 429 + 164 + + + + + 3 + 5 + 0 + 0 + + + + MusE: Midi Metronome + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 0 + 0 + 0 + 0 + + + + + ZappedChancellor + 48 + 75 + false + true + false + false + + + + Metronome + + + Metronome + + + M + + + Qt::AlignCenter + + + + + + + 0 + + + 6 + + + + + Measure Note + + + + + + + Measure Velocity + + + + + + + Beat Velocity + + + + + + + Beat Note + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + + + + + qPixmapFromMimeSource + + + 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 @@ + + + + + TransformDialogBase + + + + 0 + 0 + 630 + 418 + + + + MusE: Midi Input Transformator + + + true + + + + 11 + + + 6 + + + + + Filter + + + + 11 + + + 6 + + + + + + All + + + + + Equal + + + + + Unequal + + + + + + + + + Note + + + + + Poly Pressure + + + + + Control Change + + + + + Aftertouch + + + + + Pitch Bend + + + + + NRPN + + + + + RPN + + + + + + + + Value 2 + + + + + + + Value 1 + + + + + + + Event Type + + + + + + + + Ignore + + + + + Equal + + + + + Unequal + + + + + Higher + + + + + Lower + + + + + Inside + + + + + Outside + + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + + Ignore + + + + + Equal + + + + + Unequal + + + + + Higher + + + + + Lower + + + + + Inside + + + + + Outside + + + + + + + + + Ignore + + + + + Equal + + + + + Unequal + + + + + Higher + + + + + Lower + + + + + Inside + + + + + Outside + + + + + + + + Channel + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + + + + Processing + + + + 11 + + + 6 + + + + + Event Type + + + + + + + + Keep + + + + + Fix + + + + + + + + + Note + + + + + Poly Pressure + + + + + Control Change + + + + + Aftertouch + + + + + Pitch Bend + + + + + NRPN + + + + + RPN + + + + + + + + + Keep + + + + + Plus + + + + + Minus + + + + + Multiply + + + + + Divide + + + + + Fix + + + + + Value 2 + + + + + Invert + + + + + ScaleMap + + + + + Flip + + + + + Dyn + + + + + Random + + + + + + + + Value 1 + + + + + + + Value 2 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 127 + + + + + + + + Keep + + + + + Plus + + + + + Minus + + + + + Multiply + + + + + Divide + + + + + Fix + + + + + Value 1 + + + + + Invert + + + + + Dyn + + + + + Random + + + + + + + + + Keep + + + + + Plus + + + + + Minus + + + + + Multiply + + + + + Divide + + + + + Fix + + + + + Value 1 + + + + + Invert + + + + + Dyn + + + + + Random + + + + + + + + Channel + + + + + + + + + + + + + + + + + + + + + + qPixmapFromMimeSource + + selEventOp + selType + selVal1Op + selVal1a + selVal1b + selVal2Op + selVal2a + selVal2b + selChannelOp + selChannelVala + selChannelValb + procEventOp + procType + procVal1Op + procVal1b + procVal2Op + procVal2b + procChannelOp + procChannelValb + + + + 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 Binary files /dev/null and b/muse/muse/.muse.bin.bak 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 fr 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 Lnge 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 knnen 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 @@ + + + + + AboutBox + + + + 0 + 0 + 568 + 276 + + + + + 7 + 7 + 0 + 0 + + + + + + + 0 + 0 + 0 + + + 221 + 223 + 228 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 85 + 85 + 85 + + + 199 + 199 + 199 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 239 + 237 + 165 + + + 0 + 0 + 0 + + + 103 + 141 + 178 + + + 255 + 255 + 255 + + + 0 + 0 + 238 + + + 82 + 24 + 139 + + + 232 + 232 + 232 + + + + + 0 + 0 + 0 + + + 221 + 223 + 228 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 85 + 85 + 85 + + + 199 + 199 + 199 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 255 + 255 + 255 + + + 239 + 237 + 165 + + + 0 + 0 + 0 + + + 103 + 141 + 178 + + + 255 + 255 + 255 + + + 0 + 0 + 238 + + + 82 + 24 + 139 + + + 232 + 232 + 232 + + + + + 128 + 128 + 128 + + + 221 + 223 + 228 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 85 + 85 + 85 + + + 199 + 199 + 199 + + + 199 + 199 + 199 + + + 255 + 255 + 255 + + + 128 + 128 + 128 + + + 239 + 237 + 165 + + + 239 + 237 + 165 + + + 0 + 0 + 0 + + + 86 + 117 + 148 + + + 255 + 255 + 255 + + + 0 + 0 + 238 + + + 82 + 24 + 139 + + + 232 + 232 + 232 + + + + + + AboutBox + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 0 + 5 + 0 + 0 + + + + + + + Qt::PlainText + + + ../../share/muse_icon_64x64.png + + + + + + + + 7 + 7 + 0 + 0 + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><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</p><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;"><span style=" font-size:10pt; font-weight:400;">Version 1.0pre1</span></p><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;"></p><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. </p><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</p><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">more information.</p><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;"></p><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</p></body></html> + + + false + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Keep On Rocking! + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + doneHere + clicked() + AboutBox + accept() + + + 279 + 245 + + + 491 + 260 + + + + + 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 = ""; + 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 != "") + 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 == "") + 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 @@ + + + + + AppearanceDialogBase + + + + 0 + 0 + 583 + 395 + + + + MusE: Appearance settings + + + + 9 + + + 6 + + + + + + 3 + 7 + 0 + 0 + + + + + Arranger + + + + 9 + + + 6 + + + + + Background + + + false + + + + 9 + + + 6 + + + + + select... + + + + + + + select... + + + + + + + Color + + + + + + + Pixmap + + + + + + + + 7 + 1 + 0 + 0 + + + + bg + + + Qt::AlignCenter + + + -1 + + + + + + + Color + + + Qt::AlignCenter + + + + + + + + + + show snap grid + + + + + + + Events + + + + 11 + + + 6 + + + + + note on + + + + + + + poly pressure + + + + + + + controller + + + + + + + aftertouch + + + + + + + pitch bend + + + + + + + program change + + + + + + + special + + + + + + + + + + Parts + + + + 11 + + + 6 + + + + + show names + + + + + + + show events + + + + + + + show Cakewalk Style + + + + + + + + + + + Colors + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + V + + + Qt::AlignCenter + + + + + + + 255 + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + S + + + Qt::AlignCenter + + + + + + + 255 + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + H + + + Qt::AlignCenter + + + + + + + 255 + + + Qt::Horizontal + + + + + + + + + add to palette + + + + + + + + 1 + 7 + 0 + 0 + + + + true + + + + Items + + + + + + + + + 7 + 7 + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + Qt::NoFocus + + + Palette + + + + 9 + + + 6 + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + true + + + + + + + + + + + Style/Fonts + + + + 0 + + + 6 + + + + + + 7 + 5 + 0 + 0 + + + + QT Theme + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + + 1 + 0 + 0 + 0 + + + + + Windows + + + + + MusE + + + + + Metal + + + + + Norwegian Wood + + + + + Platinum + + + + + CDE + + + + + Motif + + + + + Motif Plus + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 190 + 20 + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + + + + Fonts + + + + 11 + + + 6 + + + + + Family + + + + + + + Size + + + + + + + Font 1 + + + + + + + Font 2 + + + + + + + Font 3 + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + Font 0 + + + + + + + + 4 + 0 + 0 + 0 + + + + + + + + + 4 + 0 + 0 + 0 + + + + + + + + + 4 + 0 + 0 + 0 + + + + + + + + + 4 + 0 + 0 + 0 + + + + + + + + Bold + + + + + + + Bold + + + + + + + Bold + + + + + + + Bold + + + + + + + Italic + + + + + + + Italic + + + + + + + Italic + + + + + + + Italic + + + + + + + + 4 + 1 + 0 + 0 + + + + ... + + + + + + + + 4 + 1 + 0 + 0 + + + + ... + + + + + + + + 4 + 1 + 0 + 0 + + + + ... + + + + + + + + 4 + 1 + 0 + 0 + + + + ... + + + + + + + Font 4 + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + Font 5 + + + + + + + + 7 + 0 + 0 + 0 + + + + + + + + + 4 + 0 + 0 + 0 + + + + + + + + + 4 + 0 + 0 + 0 + + + + + + + + Bold + + + + + + + Bold + + + + + + + Italic + + + + + + + Italic + + + + + + + + 4 + 1 + 0 + 0 + + + + ... + + + + + + + + 4 + 1 + 0 + 0 + + + + ... + + + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Apply + + + + + + + Ok + + + true + + + + + + + Cancel + + + + + + + + + qPixmapFromMimeSource + + TabWidget2 + itemList + addToPalette + hslider + sslider + vslider + applyButton + okButton + cancelButton + partShownames + partShowevents + partShowCakes + eventNoteon + eventPolypressure + eventController + eventAftertouch + eventPitchbend + eventProgramchange + eventSpecial + arrGrid + themeComboBox + fontName0 + fontName1 + fontName2 + fontName3 + fontSize0 + fontSize1 + fontSize2 + fontSize3 + bold1 + bold2 + bold3 + bold0 + italic2 + italic3 + italic1 + italic0 + fontName4 + fontName5 + fontSize4 + fontSize5 + bold4 + bold5 + italic4 + italic5 + + + + 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 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 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<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 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 @@ + + + + + ConfigTrackListBase + + + + 0 + 0 + 545 + 352 + + + + MusE: Config Track List + + + true + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Track Type: + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + Available Items: + + + + + + + QAbstractItemView::SelectRows + + + 0 + + + + + + + + + 0 + + + 6 + + + + + Add + + + + + + + Remove + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + Up + + + + + + + Down + + + + + + + + + 0 + + + 6 + + + + + Configured Items + + + + + + + QAbstractItemView::SelectRows + + + + + + + + + + + 0 + + + 6 + + + + + Track Name Size: + + + + + + + 40 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + + + + true + + + true + + + + + + + &Cancel + + + + + + true + + + + + + + + + qPixmapFromMimeSource + + + + ok + clicked() + ConfigTrackListBase + accept() + + + 393 + 321 + + + 259 + 326 + + + + + cancel + clicked() + ConfigTrackListBase + reject() + + + 484 + 327 + + + 437 + 283 + + + + + 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 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 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::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 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 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 TrElementList; +typedef TrElementList::iterator iTrElement; + +class TrGroupList : public std::list { + }; +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 + +#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::iterator iAudioAux; +typedef tracklist::const_iterator ciAudioAux; +typedef tracklist 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::iterator iAudioGroup; +typedef tracklist::const_iterator ciAudioGroup; +typedef tracklist 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::iterator iAudioInput; +typedef tracklist::const_iterator ciAudioInput; +typedef tracklist 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::iterator iAudioOutput; +typedef tracklist::const_iterator ciAudioOutput; +typedef tracklist 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 + +#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 + +#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 + +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 @@ + + + + + ConfigMidiFileBase + + + + 0 + 0 + 541 + 280 + + + + MusE: Config Midi File Export + + + true + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + + + + true + + + true + + + + + + + &Cancel + + + + + + true + + + + + + + + + + 0 (single track) + + + + + 1 (multiple tracks) + + + + + + + + Format: + + + + + + + + 96 + + + + + 192 + + + + + 384 + + + + + + + + Division: + + + + + + + Copyright: + + + + + + + + + + Enable extended smf format + + + + + + + qPixmapFromMimeSource + + + 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 (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(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 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 { + public: + }; + +typedef CtrlRecList::iterator iCtrlRec; +typedef std::map > 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 > 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 @@ + + + + + ConfigMidiCtrlBase + + + + 0 + 0 + 463 + 448 + + + + MusE: Config Midi Controller + + + + 8 + + + 6 + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Midi Port:</p></body></html> + + + + + + + + 7 + 5 + 0 + 0 + + + + QFrame::Panel + + + QFrame::Sunken + + + 2 + + + TextLabel + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Available Controller:</p></body></html> + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Add + + + + + + + Remove + + + + + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Automated Controller:</p></body></html> + + + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + buttonOk + clicked() + ConfigMidiCtrlBase + accept() + + + 278 + 253 + + + 96 + 254 + + + + + buttonCancel + clicked() + ConfigMidiCtrlBase + reject() + + + 369 + 253 + + + 179 + 282 + + + + + 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* AlsaMidi::outputPorts() + { + std::list* clientList = new std::list; + 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* AlsaMidi::inputPorts() + { + std::list* clientList = new std::list; + + 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 +#include + +#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* outputPorts(); + virtual std::list* 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(¶ms); + + + 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* outputPorts() = 0; + virtual std::list* 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 oPorts; + std::vector 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* outputPorts(); + virtual std::list* 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::const_iterator i = iPorts.begin(); i != iPorts.end(); ++i, ++k) { + if (s == *i) + return (void*)(3000+k); + } + k = 0; + for (std::vector::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* DummyAudio::outputPorts() + { + std::list* clientList = new std::list; + 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* DummyAudio::inputPorts() + { + std::list* clientList = new std::list; + 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 +#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* JackAudio::outputPorts() + { + const char** ports = jack_get_ports(_client, 0, 0, 0); + std::list* clientList = new std::list; + 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* JackAudio::inputPorts() + { + const char** ports = jack_get_ports(_client, 0, 0, 0); + std::list* clientList = new std::list; + 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(¶m, 0, sizeof(param)); + int rv = pthread_getschedparam(t, &policy, ¶m); + 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 +#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* outputPorts(); + virtual std::list* 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 +#include +#include +#include +#include +#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 +#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 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) +#include +#include +#else +#include +#endif +#include +#include +#include +#include + + +#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 + +#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 +#include +#include +#include + +#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::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::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::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 +#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 pIdx; + std::vector iIdx; + std::vector 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 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 +// +// 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; ictrlEdits[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(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(id, temp)); + } + else if (tag == "editorsettings") { + EditorSettings* temp = new EditorSettings(); + temp->readStatus(node.firstChild()); + insert(std::pair(id, temp)); + } + else if (tag == "drumeditorsettings") { + DrumEditorSettings* temp = new DrumEditorSettings(); + temp->readStatus(node.firstChild()); + insert(std::pair(id, temp)); + } + else if (tag == "prollsettings") { + PianorollSettings* temp = new PianorollSettings(); + temp->readStatus(node.firstChild()); + insert(std::pair(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 +// +// 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 +#include + +#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::iterator iSettingsList; +typedef std::multimap::const_iterator ciSettingsList; + +class SettingsList : public std::multimap + { + 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 > EL; +typedef EL::iterator iEvent; +typedef EL::reverse_iterator riEvent; +typedef EL::const_iterator ciEvent; +typedef std::pair 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 >::insert(std::pair (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 >::insert(std::pair (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 @@ + + + + + ExportMidiDialogBase + + + + 0 + 0 + 425 + 316 + + + + MusE: Export Midi + + + + 9 + + + 6 + + + + + + + + + + + + Qt::Horizontal + + + + + + + SMF Typ 0 (single track) + + + + + + + SMF Typ 1 (multiple tracks) + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + 6 + + + + + Save As: + + + + + + + + + + ... + + + :/xpm/filenew.png + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + + + okButton + clicked() + ExportMidiDialogBase + accept() + + + 321 + 274 + + + 96 + 254 + + + + + cancelButton + clicked() + ExportMidiDialogBase + reject() + + + 414 + 274 + + + 179 + 282 + + + + + 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 +// +// 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::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 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::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 sizes = splitter->sizes(); + QList newSizes; + QListIterator 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 +// +// 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 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 . + */ + +#ifndef __pbd_fastlog_h__ +#define __pbd_fastlog_h__ + +#include /* 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* ol = midiDriver->inputPorts(); + int i = 0; + for (std::list::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::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 @@ + + + + + GlobalSettingsDialogBase + + + + 0 + 0 + 596 + 562 + + + + Dialog + + + + 9 + + + 6 + + + + + + Application + + + + 9 + + + 6 + + + + + Start MusE + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + start song + + + + + + + + + + + + + + + + 9 + + + 6 + + + + + start with last song + + + + + + + start with template: default.med + + + + + + + start with song + + + + + + + + + + 0 + + + 6 + + + + + show splash screen + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Views + + + + 9 + + + 6 + + + + + Cur + + + + + + + show + + + + + + + Mixer 1 + + + + + + + Big Time + + + + + + + Cur + + + + + + + Cur + + + + + + + Cur + + + + + + + 9999 + + + + + + + 9999 + + + 0 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + 9999 + + + + + + + show + + + + + + + show + + + + + + + Mixer 2 + + + + + + + Transport + + + + + + + Arranger + + + + + + + show + + + + + + + Cur + + + + + + + + + + + Editors + + + + + 9 + 9 + 556 + 457 + + + + + Pianoroll + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 211 + + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><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</p></body></html> + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><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</p></body></html> + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><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</p></body></html> + + + + + + + height: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + width: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 9999 + + + 50 + + + + + + + 9999 + + + 50 + + + + + + + + + + + + + + DrumEditor + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 351 + + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><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</p></body></html> + + + + + + + 9999 + + + 50 + + + + + + + width: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 9999 + + + 50 + + + + + + + height: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + MasterEditor + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 331 + + + + + + + + 9999 + + + 50 + + + + + + + height: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 9999 + + + 50 + + + + + + + width: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><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</p></body></html> + + + + + + + + WaveEditor + + + + 9 + + + 6 + + + + + 9999 + + + 50 + + + + + + + height: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + width: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-size:10pt; font-weight:400; font-style:normal; text-decoration:none;"><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</p></body></html> + + + + + + + 9999 + + + 50 + + + + + + + Qt::Vertical + + + + 20 + 351 + + + + + + + + + + + Audio + + + + 9 + + + 6 + + + + + Mixer + + + + 9 + + + 6 + + + + + ms + + + 5000 + + + 20 + + + + + + + Peak Hold Time: + + + + + + + dB + + + 0 + + + -100 + + + 10 + + + -60 + + + + + + + dB + + + 0 + + + -100 + + + -60 + + + + + + + min. Meter Val + + + + + + + min. Slider Val + + + + + + + + + + use JACK freewheel mode if possible + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + Midi + + + + 8 + + + 6 + + + + + Ticks + + + + 9 + + + 6 + + + + + Displayed Resolution +(Ticks/Quarternote) + + + + + + + RTC Resolution +(Ticks/Sec) + + + + + + + + 1024 + + + + + 2048 + + + + + 4096 + + + + + 8172 + + + + + + + + 0 + + + + 48 + + + + + 96 + + + + + 192 + + + + + 384 + + + + + 768 + + + + + 1536 + + + + + 3072 + + + + + 6144 + + + + + 12288 + + + + + + + + + + + Input Routing + + + + 8 + + + 6 + + + + + Connect to all Tracks + + + + + + + Connect to all Input Devices + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Preferred Input Device:</p></body></html> + + + + + + + + + + Create Default Input Strip + + + + + + + + + + Output Routing + + + + 8 + + + 8 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Preferred Output Device:</p></body></html> + + + + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Preferred Instrument:</p></body></html> + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + + GUI + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Help Browser + + + + + + + /sec + + + 100 + + + 2 + + + + + + + GUI Refresh Rate: + + + + + + + + RemoteControl + + + + 9 + + + 6 + + + + + Midi Remote Control + + + true + + + + 9 + + + 6 + + + + + Record + + + + + + + Goto Left Mark + + + + + + + Stop + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Play + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + Apply + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + RecordButton + QToolButton +
recordbutton.h
+ 0 + +
+ + GreendotButton + QToolButton +
greendotbutton.h
+ 0 + +
+ + RasterCombo + QComboBox +
rastercombo.h
+ 0 + +
+ + QuantCombo + QComboBox +
quantcombo.h
+ 0 + +
+
+ + + + okButton + clicked() + GlobalSettingsDialogBase + accept() + + + 278 + 253 + + + 96 + 254 + + + + + cancelButton + clicked() + GlobalSettingsDialogBase + reject() + + + 369 + 253 + + + 179 + 282 + + + + +
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 +#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* ol = midiDriver->inputPorts(); + for (std::list::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 Lcke von einem + // Takt gebildet; die Lnge 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* pg = (*i)->groups(); + for (std::vector::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 @@ + + + + + EditInstrumentBase + + + + 0 + 0 + 750 + 644 + + + + MusE: Instrument Editor + + + + + Qt::Horizontal + + + + + + Patches + + + + 9 + + + 6 + + + + + Qt::Horizontal + + + + + 7 + 7 + 0 + 0 + + + + true + + + + Patch/Group + + + + + + + 0 + + + 6 + + + + + + + + Patch Name: + + + + + + + Program: + + + + + + + 5 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + &Delete + + + Alt+D + + + + + + + + 5 + 1 + 0 + 0 + + + + &New Patch + + + Alt+N + + + + + + + New Group + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 240 + 20 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 280 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 280 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 280 + 20 + + + + + + + + d.c. + + + 127 + + + -1 + + + -1 + + + + + + + High Bank: + + + + + + + Low Bank: + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 90 + + + + + + + + d.c. + + + 127 + + + -1 + + + -1 + + + + + + + + + + 6 + + + 6 + + + + + Drum + + + + + + + GM + + + + + + + GS + + + + + + + XG + + + + + + + + + + + + + + Controller + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Predefined Controller: + + + + + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + + + + + 1 + 5 + 0 + 0 + + + + Properties + + + + 10 + + + 6 + + + + + Name + + + + + + + Type + + + + + + + 2 + + + 6 + + + + + + Control7 + + + + + Control14 + + + + + RPN + + + + + NRPN + + + + + Pitch + + + + + Program + + + + + + + + H-Ctrl + + + 10 + + + + + + + Midi Controller Number High Byte + + + 127 + + + 0 + + + 1 + + + + + + + L-Ctrl + + + 10 + + + + + + + Midi Controller Number Low Byte + + + 127 + + + 0 + + + 1 + + + + + + + + + + + + Range + + + + + + + 0 + + + 6 + + + + + Min + + + 10 + + + + + + + 16384 + + + -16385 + + + + + + + Max + + + 10 + + + + + + + 16384 + + + -16385 + + + 127 + + + + + + + Default + + + + + + + + + + + + + + + list of defined controllers + + + This is the MusE list of defined controllers. + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + Name + + + + + Type + + + + + H-Ctrl + + + + + L-Ctrl + + + + + Min Val + + + + + Max Val + + + + + + + + + SysEx + + + + 0 + + + 6 + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 130 + + + + + + + + + 1 + 7 + 0 + 0 + + + + + + + + + + + Hex Entry: + + + + + + + + + + + + 0 + 0 + 750 + 35 + + + + false + + + + + 0 + 0 + 155 + 213 + + + + &File + + + + + + + + + + + + + image0 + + + &New + + + New + + + Ctrl+N + + + + + image1 + + + &Open... + + + Open + + + Ctrl+O + + + + + image2 + + + &Save + + + Save + + + Ctrl+S + + + + + Save &As... + + + Save As + + + + + + + + E&xit + + + Exit + + + + + + + + + + + + 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::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::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::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 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 pg; + MidiControllerList* _controller; + std::vector 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* sysexList() { return &sysex; } + MidiController* midiController(int num) const; + void reset(MidiOutPort*); + + std::vector* groups() { return &pg; } + }; + +//--------------------------------------------------------- +// MidiInstrumentList +//--------------------------------------------------------- + +class MidiInstrumentList : public std::vector { + + 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 @@ + + + + + Dialog + + + + 0 + 0 + 436 + 361 + + + + Dialog + + + + 8 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + + + 8 + + + 6 + + + + + Program + + + + + + + + + + + + + + + + L-Bank + + + + + + + H-Bank + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Patch Name + + + + + + + + + 8 + + + 6 + + + + + Value + + + + + + + Controller + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + + Time Position: + + + + + + + Midi Port: + + + + + + + + + + Midi Channel: + + + + + + + + + 0 + + + 6 + + + + + Available Controller: + + + + + + + + + + Create New Controller + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + okButton + clicked() + Dialog + accept() + + + 278 + 253 + + + 96 + 254 + + + + + cancelButton + clicked() + Dialog + reject() + + + 369 + 253 + + + 179 + 282 + + + + + 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* sl = mi->sysexList(); + for (std::vector::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* sl = mi->sysexList(); + for (std::vector::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 @@ + + + + + EditNoteDialogBase + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + 8 + + + 6 + + + + + + + + + + + + + + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Velocity Off:</p></body></html> + + + + + + + Velocity On: + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Arial; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pitch:</p></body></html> + + + + + + + Length: + + + + + + + Time Position: + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + okButton + clicked() + EditNoteDialogBase + accept() + + + 278 + 253 + + + 96 + 254 + + + + + cancelButton + clicked() + EditNoteDialogBase + reject() + + + 369 + 253 + + + 179 + 282 + + + + + 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 { + 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 Binary files /dev/null and b/muse/muse/midiedit/.Ped-tk 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 >::insert( + std::pair (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 >::iterator iCItem; +typedef std::multimap >::const_iterator ciCItem; + +//--------------------------------------------------------- +// CItemList +// Canvas Item List +//--------------------------------------------------------- + +class CItemList: public std::multimap > { + 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 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); + + // dontt 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 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::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 elist; + for (iEvent e = el->lower_bound(pos[0].tick()); e != el->end(); ++e) + elist.push_back((Event)e->second); + for (std::list::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 @@ + + + + + QuantConfigBase + + + + 0 + 0 + 333 + 193 + + + + MusE: Configure Quantize + + + + 9 + + + 6 + + + + + 500 + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + Strength: + + + + + + + % + + + 100 + + + + + + + Don't Quantize: + + + + + + + Quant Len + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + okButton + clicked() + QuantConfigBase + accept() + + + 278 + 253 + + + 96 + 254 + + + + + cancelButton + clicked() + QuantConfigBase + reject() + + + 369 + 253 + + + 179 + 282 + + + + + 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 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 + +#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() + { + 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::iterator iMidiPlugin; + +class MidiPluginList : public std::list { + 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 { + 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 { + + 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::iterator iMidiSynti; +typedef tracklist::const_iterator ciMidiSynti; +typedef tracklist 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::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::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::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) // dont 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 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::iterator iMidiTrack; +typedef tracklist::const_iterator ciMidiTrack; +typedef tracklist 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 MidiTransformationList; +typedef std::list::iterator iMidiTransformation; +typedef std::list::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* ol = audioDriver->outputPorts(); + for (std::list::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* ol = audioDriver->inputPorts(); + for (std::list::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 auxKnob; + std::vector auxLabel; + std::vector 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::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 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 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 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 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 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 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* ol = midiDriver->outputPorts(); + int idx = 0; + for (std::list::iterator ip = ol->begin(); ip != ol->end(); ++ip, ++idx) { + QAction* oa = pup->addAction(ip->name); + + QMap 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 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::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 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 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 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* ol = midiDriver->inputPorts(); + for (std::list::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 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 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 +//#include +#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;igetParameterName(i)); + fval.setNum(plug->param(i)); // wierd stuff to avoid localization + QString str=""; + 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 + +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 sl = audioDriver->outputPorts(); + for (std::list::iterator i = sl.begin(); i != sl.end(); ++i) + newSrcList->insertItem(*i); + sl = audioDriver->inputPorts(); + for (std::list::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 @@ + + + + + RouteDialogBase + + + + 0 + 0 + 316 + 383 + + + + + 5 + 7 + 0 + 0 + + + + MusE: Routing + + + + 4 + + + 4 + + + + + Add Route + + + + 4 + + + 4 + + + + + 0 + + + 6 + + + + + + 7 + 7 + 0 + 0 + + + + Source: + + + + 2 + + + 0 + + + + + + + + + + + + 7 + 7 + 0 + 0 + + + + Destination: + + + + 2 + + + 0 + + + + + + + + + + + + + + 4 + 1 + 0 + 0 + + + + connect source to destination + + + Connect + + + + + + + + + + Current Routes + + + + 4 + + + 4 + + + + + + + + + 4 + 1 + 0 + 0 + + + + remove selected route + + + Remove + + + + + + + + + + qPixmapFromMimeSource + + + 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 +#include "evdata.h" +#include + +#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, +// __gnu_cxx::__mt_alloc > MPEL; + +typedef std::multiset > 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 > MREL; + +typedef std::list 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 +#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 new song.
" + "You can also select the Open command 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::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::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 @@ + + + + xpm/muse_icon_64x64.png + xpm/splash.png + xpm/filenew.png + xpm/fileopen.png + xpm/filesave.png + xpm/punchin.xpm + xpm/punchout.xpm + xpm/loop.xpm + xpm/start.xpm + xpm/stop.xpm + xpm/play.xpm + xpm/frewind.xpm + xpm/fforward.xpm + + + 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 @@ + + + + + MuseBase + + + + 0 + 0 + 800 + 600 + + + + MusE + + + + + + 0 + 0 + 800 + 35 + + + + + + :/xpm/start.xpm + + + start action + + + + + :/xpm/frewind.xpm + + + rewind + + + + + :/xpm/fforward.xpm + + + forward + + + + + true + + + true + + + :/xpm/stop.xpm + + + stop + + + + + true + + + false + + + :/xpm/play.xpm + + + play + + + + + + + + + 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 (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 CloneList; +typedef CloneList::iterator iClone; +extern CloneList cloneList; + +//--------------------------------------------------------- +// CtrlCanvas +//--------------------------------------------------------- + +struct CtrlCanvas { + int ctrlId; + int height; + }; + +typedef std::list 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 > 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 + +#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() + { + 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 pIdx; + + int _inports; + std::vector iIdx; + + int _outports; + std::vector 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::iterator iPlugin; + +class PluginList : public std::list { + 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 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 { + 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.
" + "Note that using mono plugins on stereo tracks is not a problem, two will be used in parallell.
" + "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 = " " + "Click this button to load a saved preset."; +static const char* presetSaveText = "Click this button to save curent parameter " + "settings as a preset. 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 <%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::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::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::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 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 + +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 { + 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 +// +// 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 +// +// 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* op = audioDriver->outputPorts(); + std::list::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* op = audioDriver->inputPorts(); + std::list::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* Song::synthesizer() const + { + std::vector* l = new std::vector; + + for (std::vector::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* 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 + +#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 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::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::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 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::iterator iSynthI; +typedef tracklist::const_iterator ciSynthI; +typedef tracklist SynthIList; + +extern std::vector 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 +#include +#include + +#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 + +//--------------------------------------------------------- +// 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 PollList; +typedef std::list::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 (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("%s", + Route::tname(rt), r->name().toLatin1().data()); + xml.put("%s", 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("%d:%s", tname, r->channel + 1, name().toLatin1().data()); + else + xml.put("%s", tname, name().toLatin1().data()); + + switch(r->type) { + case Route::AUDIOPORT: + xml.put("%s", r->name().toLatin1().data()); + break; + case Route::MIDIPORT: + xml.put("%s", r->name().toLatin1().data()); + break; + case Route::SYNTIPORT: + xml.put("%s", r->name().toLatin1().data()); + break; + case Route::TRACK: + xml.put("%s", 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 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 tracklist : public std::vector { + typedef std::vector 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 TrackList; +typedef TrackList::iterator iTrack; +typedef TrackList::reverse_iterator irTrack; +typedef TrackList::const_iterator ciTrack; + +typedef tracklist::iterator iMidiInPort; +typedef tracklist::const_iterator ciMidiInPort; +typedef tracklist MidiInPortList; + +typedef tracklist::iterator iMidiOutPort; +typedef tracklist::const_iterator ciMidiOutPort; +typedef tracklist MidiOutPortList; + +typedef tracklist::iterator iMidiChannel; +typedef tracklist::const_iterator ciMidiChannel; +typedef tracklist 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 @@ + + + + + TransportBase + + + + 0 + 0 + 763 + 108 + + + + + 0 + 0 + 0 + 0 + + + + MusE: Transport Panel + + + + 1 + + + 1 + + + + + 3 + + + 2 + + + + + + Overdub + + + + + Replace + + + + + + + + + Sans Serif + 6 + 50 + false + false + false + false + + + + Rec Mode + + + Qt::AlignCenter + + + + + + + + Normal + + + + + Mix + + + + + Replace + + + + + + + + + Sans Serif + 6 + 50 + false + false + false + false + + + + Cycle Rec + + + Qt::AlignCenter + + + + + + + + + 2 + + + 2 + + + + + + 5 + 7 + 0 + 0 + + + + :/xpm/punchin.xpm + + + true + + + + + + + + 5 + 7 + 0 + 0 + + + + ... + + + :/xpm/loop.xpm + + + true + + + + + + + + 5 + 7 + 0 + 0 + + + + :/xpm/punchout.xpm + + + true + + + Qt::ToolButtonTextOnly + + + Qt::NoArrow + + + + + + + + + 2 + + + 2 + + + + + + + + + Sans Serif + 6 + 50 + false + false + false + false + + + + Left Loc + + + Qt::AlignCenter + + + + + + + + + + + Sans Serif + 6 + 50 + false + false + false + false + + + + Right Loc + + + Qt::AlignCenter + + + + + + + + + 3 + + + 2 + + + + + 0 + + + 0 + + + + + + + + + + + + + + 7 + 7 + 0 + 0 + + + + Qt::Horizontal + + + + + + + 3 + + + 1 + + + + + + 5 + 7 + 0 + 0 + + + + rewind to start + + + ... + + + :/xpm/start.xpm + + + + + + + + 5 + 7 + 0 + 0 + + + + rewind + + + ... + + + :/xpm/frewind.xpm + + + + + + + + 5 + 7 + 0 + 0 + + + + forward + + + ... + + + :/xpm/fforward.xpm + + + + + + + + 5 + 7 + 0 + 0 + + + + stop + + + ... + + + :/xpm/stop.xpm + + + true + + + + + + + + 5 + 7 + 0 + 0 + + + + play + + + ... + + + :/xpm/play.xpm + + + true + + + + + + + + 5 + 7 + 0 + 0 + + + + record + + + ... + + + true + + + + + + + + + + + 2 + + + 2 + + + + + + 5 + 7 + 0 + 0 + + + + AC + + + true + + + + + + + + 5 + 7 + 0 + 0 + + + + Click + + + true + + + + + + + + 5 + 7 + 0 + 0 + + + + Sync + + + true + + + + + + + + + 5 + + + 1 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 1 + + + 1 + + + + + + + + + + + 128 + 128 + 128 + + + 221 + 223 + 228 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 85 + 85 + 85 + + + 199 + 199 + 199 + + + 199 + 199 + 199 + + + 255 + 255 + 255 + + + 128 + 128 + 128 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 86 + 117 + 148 + + + 255 + 255 + 255 + + + 0 + 0 + 238 + + + 82 + 24 + 139 + + + 232 + 232 + 232 + + + + + 128 + 128 + 128 + + + 221 + 223 + 228 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 85 + 85 + 85 + + + 199 + 199 + 199 + + + 199 + 199 + 199 + + + 255 + 255 + 255 + + + 128 + 128 + 128 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 86 + 117 + 148 + + + 255 + 255 + 255 + + + 0 + 0 + 238 + + + 82 + 24 + 139 + + + 232 + 232 + 232 + + + + + 128 + 128 + 128 + + + 221 + 223 + 228 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 85 + 85 + 85 + + + 199 + 199 + 199 + + + 199 + 199 + 199 + + + 255 + 255 + 255 + + + 128 + 128 + 128 + + + 255 + 255 + 255 + + + 255 + 255 + 255 + + + 0 + 0 + 0 + + + 86 + 117 + 148 + + + 255 + 255 + 255 + + + 0 + 0 + 238 + + + 82 + 24 + 139 + + + 232 + 232 + 232 + + + + + + 4/4 + + + Qt::AlignCenter + + + + + + + + + + + 5 + 0 + 0 + 0 + + + + use tempo map + + + Tempomap + + + true + + + true + + + + + + + + + + + SigLabel + QLabel +
widgets/siglabel.h
+ 0 + +
+ + Awl::TempoEdit + +
awl/tempoedit.h
+ 0 + +
+ + Awl::PosEdit + +
awl/posedit.h
+ 0 + +
+
+ + + + +
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 @@ + + + + + TransposeDialogBase + + + + 0 + 0 + 289 + 317 + + + + MusE: Midi Transpose + + + + 11 + + + 6 + + + + + Value + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + -99 + + + + + + + + 3 + 1 + 0 + 0 + + + + halftones + + + + + + + + + + + + + 11 + + + 6 + + + + + all + + + true + + + + + + + between markers + + + + + + + + + + + 11 + + + 6 + + + + + all + + + true + + + + + + + + + + all in selected tracks + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + OK + + + false + + + true + + + + + + + Cancel + + + + + + + + + qPixmapFromMimeSource + + + 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 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 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 { + void undoOp(UndoOp::UndoType, int data); + }; + +typedef Undo::iterator iUndoOp; +typedef Undo::reverse_iterator riUndoOp; + +class UndoList : public std::list { + 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 +// Torben Hohn +// +// 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 +#include +#include + +#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 such that older versions + // will always return true. + return 1; + + case audioMasterWantMidi: + // is a filter which is currently ignored + return 0; + + case audioMasterGetTime: + // returns const VstTimeInfo* (or 0 if not supported) + // 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 + return 0; + + case audioMasterSetTime: + // VstTimenfo* in , filter in , not supported + + case audioMasterTempoAt: + // returns tempo (in bpm * 10000) at sample frame location passed in + 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 (-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 (-1: first to come), returns cEffect* + return 0; + + case audioMasterGetNextPlug: + // output pin in (-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 + return 0; + + case audioMasterGetSpeakerArrangement: + // (long)input in , output in + return 0; + + case audioMasterGetVendorString: + // fills with a string identifying the vendor (max 64 char) + strcpy ((char*) ptr, "LAD"); + return 0; + + case audioMasterGetProductString: + // fills 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 , 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 + 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 + return 0; + + case audioMasterEndEdit: + // end of automation session (when mouse up), parameter index in + return 0; + + case audioMasterOpenFileSelector: + // open a fileselector window with VstFileSelect* in + 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 SndFile::sndFiles; +QList 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; iseek(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; iopenWrite()) { + 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; imsgIdle(false); + return; + } + tmp.seek(0, 0); + tmp.write(file_channels, data2beoverwritten, tmpdatalen); + tmp.close(); + + // Delete dataholder for replaced original file + for (unsigned i=0; iclose(); + 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* fl; + QList 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 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 + +//--------------------------------------------------------- +// SampleV +// peak file value +//--------------------------------------------------------- + +struct SampleV { + unsigned char peak; + unsigned char rms; + }; + +class SndFile; + +class SndFileList : public QHash { + public: + SndFile* search(const QString& name) { return (*this)[name]; } + }; + +//--------------------------------------------------------- +// SndFile +//--------------------------------------------------------- + +class SndFile { + static QHash sndFiles; + static QList 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 + +#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; icmdChangeWave(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 loudest) + loudest = data[i][j]; + } + } + + double scale = 0.99 / (double)loudest; + + for (unsigned i=0; iabsolutePath(); + 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 WaveSelectionList; +typedef std::list::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::iterator iWaveTrack; +typedef tracklist::const_iterator ciWaveTrack; +typedef tracklist WaveTrackList; + +#endif + + + diff --git a/muse/muse/widgets/.Ped-tk b/muse/muse/widgets/.Ped-tk new file mode 100644 index 00000000..efb63043 Binary files /dev/null and b/muse/muse/widgets/.Ped-tk 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 + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "awl/posedit.h" +#include +#include + +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 @@ + + + + + ClipListEditorBase + + + + 0 + 0 + 600 + 480 + + + + MusE: ClipList + + + + 11 + + + 6 + + + + + true + + + true + + + + Name + + + + + Refs + + + + + Start + + + + + Len + + + + + Data + + + + + + + + Clip Properties + + + Qt::Vertical + + + + 11 + + + 6 + + + + + Pos: + + + + + + + + + + Len: + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + qPixmapFromMimeSource + + + Q3ListView + +
q3listview.h
+ 0 + +
+ + Q3GroupBox + +
Qt3Support/Q3GroupBox
+ 1 + +
+ + Awl::PosEdit + QWidget +
awl::posedit.h
+ 1 + +
+
+ + awl/posedit.h + + + +
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 @@ + + + + + CommentBase + + + + 0 + 0 + 387 + 205 + + + + Form1 + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + + 4 + 1 + 0 + 0 + + + + Track Comment + + + + + + + + Arial + 12 + 75 + false + true + false + false + + + + QFrame::Box + + + QFrame::Sunken + + + 1 + + + Track 1 + + + + + + + + + + Arial + 12 + 75 + false + true + false + false + + + + + + + qPixmapFromMimeSource + + + 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 +#include +/* + * 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 ." +#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(const_cast(this)); + if (!strcmp(_clname, "Ui::EditMetaDialogBase")) + return static_cast(const_cast(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 @@ + + + + + EditMetaDialogBase + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + 8 + + + 6 + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + + + + Enter Hex + + + + + + + Meta Type: + + + + + + + Time Position: + + + + + + + TextLabel + + + + + + + + + + okButton + clicked() + EditMetaDialogBase + accept() + + + 278 + 253 + + + 96 + 254 + + + + + cancelButton + clicked() + EditMetaDialogBase + reject() + + + 369 + 253 + + + 179 + 282 + + + + + 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 + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "awl/posedit.h" +#include +#include + +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 @@ + + + + + EditSysexDialogBase + + + + 0 + 0 + 667 + 556 + + + + MusE: Enter SysEx + + + true + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 4 + 5 + 0 + 0 + + + + Known SysEx: + + + + + + + + 4 + 7 + 0 + 0 + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + TimePosition: + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + Comment: + + + + + + + + + + + + + + 0 + + + 6 + + + + + + 1 + 0 + 0 + 0 + + + + Add + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 350 + 20 + + + + + + + + OK + + + + + + true + + + true + + + + + + + Cancel + + + + + + true + + + + + + + + + qPixmapFromMimeSource + + + Awl::PosEdit + QWidget +
awl::posedit.h
+ 1 + +
+ + Q3TextEdit + +
q3textedit.h
+ 0 + +
+ + Q3ListBox + +
q3listbox.h
+ 0 + +
+
+ + awl/posedit.h + + + +
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 @@ + + + + + FileDialogButtons + + + + 0 + 0 + 175 + 438 + + + + + 5 + 5 + 0 + 0 + + + + Form1 + + + + 11 + + + 6 + + + + + + + + true + + + Qt::Vertical + + + true + + + + 11 + + + 6 + + + + + Global + + + image0 + + + true + + + + + + + User + + + image1 + + + true + + + + + + + Project + + + image2 + + + true + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 60 + + + + + + + + Load: + + + Qt::Vertical + + + true + + + + 11 + + + 6 + + + + + Songdata + +Cofiguration + + + + + + + only +Songdata + + + true + + + + + + + + + + + + + Q3ButtonGroup + +
Qt3Support/Q3ButtonGroup
+ 1 + +
+
+ + +
diff --git a/muse/muse/widgets/fdialogbuttons1.h b/muse/muse/widgets/fdialogbuttons1.h new file mode 100644 index 00000000..e69de29b 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 @@ + + + + + GateTimeBase + + + + 0 + 0 + 387 + 392 + + + + MusE: Modify Gate Time + + + + 11 + + + 6 + + + + + Apply To + + + + 6 + + + 3 + + + + + All Events + + + + + + + Selected Events + + + true + + + + + + + Looped Events + + + + + + + Selected AND Looped + + + + + + + + + + Values + + + + 6 + + + 3 + + + + + Rate: + + + + + + + Offset: + + + + + + + % + + + 200 + + + 100 + + + + + + + 999 + + + -999 + + + 1 + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + OK + + + false + + + true + + + + + + + Cancel + + + + + + + + qPixmapFromMimeSource + + + + okButton + clicked() + GateTimeBase + accept() + + + 211 + 360 + + + 36 + 356 + + + + + cancelButton + clicked() + GateTimeBase + reject() + + + 316 + 372 + + + 124 + 378 + + + + + 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 @@ + + werner schweer + midi sync +configuration dialog + + MidiSyncConfigBase + + + + 0 + 0 + 530 + 359 + + + + + 4 + 4 + 0 + 0 + + + + MusE: Midi Sync + + + + 9 + + + 6 + + + + + Master + + + true + + + true + + + + 11 + + + 6 + + + + + true + + + Midi Time Code (MTC) + + + + + + + true + + + Midi Clock + + + + + + + true + + + Midi Machine Control (MMC) + + + + + + + 0 + + + 6 + + + + + true + + + + 5 + 0 + 0 + 0 + + + + Id: + + + + + + + true + + + + 5 + 0 + 0 + 0 + + + + device id + + + 127 + + + 0 + + + 127 + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 30 + 20 + + + + + + + + + + + + + Slave + + + true + + + false + + + + 11 + + + 6 + + + + + false + + + accept MTC + + + + + + + false + + + accept Midi Clock + + + + + + + false + + + accept MMC + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Id: + + + + + + + + 5 + 0 + 0 + 0 + + + + device id + + + 127 + + + 0 + + + 127 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Apply + + + + + + + Ok + + + true + + + + + + + Cancel + + + + + + + + + true + + + + 5 + 5 + 0 + 0 + + + + MTC + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Type: + + + + + + + + 5 + 0 + 0 + 0 + + + + + 24 + + + + + 25 + + + + + 30D + + + + + 30N + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 407 + 69 + + + + + + + + + + 0 + + + 6 + + + + + Offset: + + + + + + + false + + + hour + + + 23 + + + + + + + h + + + + + + + false + + + minute + + + 59 + + + + + + + m + + + + + + + false + + + second + + + 59 + + + + + + + s + + + + + + + false + + + frame + + + 30 + + + + + + + f + + + + + + + false + + + subframe + + + + + + + + + + + + qPixmapFromMimeSource + + acceptMTCCheckbox + acceptMCCheckbox + mtcSync + mcSync + midiMachineControl + dstDevId + mtcOffH + mtcOffM + mtcOffS + mtcOffF + mtcOffSf + applyButton + okButton + cancelButton + + + + + syncSlave + toggled(bool) + acceptMTCCheckbox + setEnabled(bool) + + + 377 + 79 + + + 341 + 67 + + + + + syncSlave + toggled(bool) + acceptMCCheckbox + setEnabled(bool) + + + 365 + 102 + + + 361 + 94 + + + + + syncSlave + toggled(bool) + acceptMMCCheckbox + setEnabled(bool) + + + 392 + 132 + + + 328 + 121 + + + + + syncSlave + toggled(bool) + srcDevId + setEnabled(bool) + + + 366 + 103 + + + 375 + 147 + + + + + mcSync + toggled(bool) + mcSync + setEnabled(bool) + + + 255 + 94 + + + 255 + 94 + + + + + mtcSync + toggled(bool) + mtcSync + setEnabled(bool) + + + 255 + 67 + + + 255 + 67 + + + + + syncMaster + toggled(bool) + midiMachineControl + setEnabled(bool) + + + 268 + 131 + + + 255 + 121 + + + + + syncMaster + toggled(bool) + dstDevId + setEnabled(bool) + + + 268 + 129 + + + 175 + 147 + + + + + syncMaster + toggled(bool) + mtcSync + setEnabled(bool) + + + 268 + 40 + + + 255 + 67 + + + + + syncMaster + toggled(bool) + GroupBox13 + setEnabled(bool) + + + 53 + 17 + + + 41 + 256 + + + + + 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 + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "awl/pitchedit.h" +#include +#include + +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 @@ + + + + + MITTransposeBase + + + + 0 + 0 + 423 + 50 + + + + MusE: Midi Input Plugin: Transpose + + + + 11 + + + 6 + + + + + On + + + + + + + TriggerKey + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 5 + + + + + + + + + + Transpose: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 5 + + + + + + + + 5 + 0 + 0 + 0 + + + + QFrame::Panel + + + 2 + + + 2 + + + +0 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 2 + + + 5 + + + + + + + qPixmapFromMimeSource + + + Awl::PitchEdit + QWidget +
awl::pitchedit.h
+ 1 + +
+
+ + awl/pitchedit.h + + + +
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 @@ + + + + + MixdownFileDialogBase + + + + 0 + 0 + 381 + 116 + + + + MusE: Set Mixdown Wavefile + + + true + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + File Path + + + + + + + Channel + + + + + + + 0 + + + 6 + + + + + + + + + + + + + + + + + + + + + Stereo + + + + + Mono + + + + + 5.1 + + + + + + + + + wav,16 Bit + + + + + wav, 24 Bit + + + + + wav, 32 Bit (float) + + + + + + + + Format + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + buttonOk + clicked() + MixdownFileDialogBase + accept() + + + 248 + 93 + + + 99 + 89 + + + + + buttonCancel + clicked() + MixdownFileDialogBase + reject() + + + 318 + 94 + + + 170 + 105 + + + + + 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 @@ + + + + + MidiTrackInfoBase + + + + 0 + 0 + 155 + 550 + + + + + 0 + 2 + 0 + 0 + + + + + 0 + 0 + + + + + 32767 + 32767 + + + + MusE: TrackInfo + + + + + + + + + + 0 + + + 0 + + + + + + 5 + 0 + 0 + 0 + + + + Output Channel + + + all midi events are send to this output channel + + + 16 + + + 1 + + + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::WinPanel + + + QFrame::Raised + + + 1 + + + 0 + + + Track Info + + + Qt::AlignCenter + + + + + + + + 5 + 0 + 0 + 0 + + + + Modify Note Length + + + % + + + 200 + + + 25 + + + 100 + + + + + + + + 7 + 0 + 0 + 0 + + + + Track Name + + + + + + + + 7 + 0 + 0 + 0 + + + + Output Port + + + + + + + + 5 + 0 + 0 + 0 + + + + OCh. + + + 2 + + + + + + + + 5 + 0 + 0 + 0 + + + + Track Delay (ticks) + + + off + + + 1000 + + + -1000 + + + + + + + + 5 + 0 + 0 + 0 + + + + 127 + + + -127 + + + 0 + + + + + + + + 5 + 0 + 0 + 0 + + + + Compress Note Velocity + + + % + + + + + + 200 + + + 25 + + + 100 + + + + + + + + 1 + 0 + 0 + 0 + + + + Pitch Transpose + + + off + + + 127 + + + -127 + + + 1 + + + + + + + + 5 + 0 + 0 + 0 + + + + Transp. + + + + + + + + 5 + 0 + 0 + 0 + + + + Delay + + + + + + + + 5 + 0 + 0 + 0 + + + + Compr. + + + + + + + + 5 + 0 + 0 + 0 + + + + Modify Note Velocity + + + Velocity + + + + + + + + 5 + 0 + 0 + 0 + + + + Length + + + + + + + + 7 + 0 + 0 + 0 + + + + Input Ports + + + + + + + + 5 + 0 + 0 + 0 + + + + IChan. + + + 2 + + + + + + + + 5 + 0 + 0 + 0 + + + + Input Channels + + + 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 + + + + + + + + 7 + 4 + 0 + 0 + + + + QFrame::WinPanel + + + QFrame::Raised + + + 1 + + + 1 + + + Channel Info + + + Qt::AlignCenter + + + + + + + + 7 + 0 + 0 + 0 + + + + Select Instrument Patch + + + ??? + + + + + + + 0 + + + 6 + + + + + + + + 5 + 0 + 0 + 0 + + + + off + + + 128 + + + 0 + + + 0 + + + + + + + + 5 + 0 + 0 + 0 + + + + Bank Select LSB + + + off + + + 128 + + + 0 + + + 0 + + + + + + + + 5 + 0 + 0 + 0 + + + + Bank Select MSB + + + off + + + 128 + + + 0 + + + 0 + + + + + + + + 5 + 0 + 0 + 0 + + + + Instrument High Bank + + + H-Bank + + + + + + + + 5 + 0 + 0 + 0 + + + + Instrument Low Bank + + + 0 + + + L-Bank + + + 0 + + + 2 + + + + + + + + 5 + 0 + 0 + 0 + + + + Instrument/Program/Patch + + + Progr. + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 40 + + + + + + + + + + + OutportCombo + +
outportcombo.h
+ 0 + +
+
+ + iName + iOutput + iOutputChannel + iInput + iInputChannel + iTransp + iVerz + iLen + iAnschl + iKompr + iPatch + iProgram + + + +
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, Lnge, 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 , (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 , (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 @@ + + + + + ShortcutCaptureDialogBase + + + + 0 + 0 + 461 + 214 + + + + Enter shortcut sequence + + + true + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + OK + + + + + + + + + + Cancel + + + + + + + + + + + + New shortcut: + + + + + + + true + + + + + + + Press keys to enter shortcut sequence! + + + Qt::AlignCenter + + + + + + + Old shortcut: + + + + + + + true + + + + + + + + + + + + + + qPixmapFromMimeSource + + + 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 , (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 , (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 @@ + + + + + ShortcutConfigBase + + + + 0 + 0 + 466 + 403 + + + + Configure Keyboard Shortcuts + + + true + + + + 11 + + + 6 + + + + + + + + + 0 + + + 3 + + + + + + 5 + 7 + 1 + 0 + + + + + 105 + 200 + + + + 0 + + + false + + + 1 + + + true + + + + Category + + + + + + + + + 7 + 7 + 2 + 0 + + + + + 170 + 230 + + + + 0 + + + false + + + 2 + + + true + + + + Description + + + + + Shortcut + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 150 + 21 + + + + + + + + false + + + &Clear + + + Alt+C + + + + + + + false + + + &Define + + + Alt+D + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 30 + 21 + + + + + + + + &Apply + + + Alt+A + + + + + + + + + qPixmapFromMimeSource + + + 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 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 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 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 +#include +//Added by qt3to4: +#include +#include +#include + +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 }, + {¬e1Icon, 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 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 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 @@ + + + + + MidiTransformDialogBase + + + + 0 + 0 + 843 + 659 + + + + MusE: Midi Transformator + + + true + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + &New + + + true + + + + + + + &Delete + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + &Apply + + + true + + + + + + + &OK + + + true + + + true + + + + + + + &Cancel + + + true + + + + + + + + + 0 + + + 6 + + + + + PresetList + + + + + + + + 3 + 3 + 0 + 0 + + + + + + + + + + Processing + + + Qt::Vertical + + + + 11 + + + 6 + + + + + Event Type + + + + + + + + Keep + + + + + Fix + + + + + + + + + Note + + + + + Poly Pressure + + + + + Control Change + + + + + Aftertouch + + + + + Pitch Bend + + + + + NRPN + + + + + RPN + + + + + + + + + Keep + + + + + Plus + + + + + Minus + + + + + Multiply + + + + + Divide + + + + + Fix + + + + + Value 2 + + + + + Invert + + + + + ScaleMap + + + + + Flip + + + + + Dyn + + + + + Random + + + + + + + + Value 1 + + + + + + + Value 2 + + + + + + + Length + + + + + + + Position + + + + + + + + Keep + + + + + Plus + + + + + Minus + + + + + Multiply + + + + + Divide + + + + + Fix + + + + + Value 1 + + + + + Invert + + + + + Dyn + + + + + Random + + + + + + + + + Keep + + + + + Plus + + + + + Minus + + + + + Multiply + + + + + Divide + + + + + Fix + + + + + + + + 9999 + + + + + + + 9999 + + + + + + + + + + + Keep + + + + + Plus + + + + + Minus + + + + + Multiply + + + + + Divide + + + + + + + + + + + + + + + + + + + + Filter + + + Qt::Vertical + + + + 11 + + + 6 + + + + + + All + + + + + Equal + + + + + Unequal + + + + + + + + + Note + + + + + Control Change + + + + + Sysex + + + + + Poly Pressure + + + + + Aftertouch + + + + + Meta + + + + + + + + Value 2 + + + + + + + Value 1 + + + + + + + Event Type + + + + + + + + Ignore + + + + + Equal + + + + + Unequal + + + + + Higher + + + + + Lower + + + + + Inside + + + + + Outside + + + + + + + + Length + + + + + + + Bar Range + + + + + + + + Ignore + + + + + Equal + + + + + Unequal + + + + + Higher + + + + + Lower + + + + + Inside + + + + + Outside + + + + + + + + + Ignore + + + + + Equal + + + + + Unequal + + + + + Higher + + + + + Lower + + + + + Inside + + + + + Outside + + + + + + + + + Ignore + + + + + Equal + + + + + Unequal + + + + + Higher + + + + + Lower + + + + + Inside + + + + + Outside + + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + 127 + + + + + + + + + + + + + + + + 0 + + + 6 + + + + + Preset + + + Qt::Vertical + + + + 11 + + + 6 + + + + + 0 + + + 6 + + + + + Name: + + + + + + + + + + + + Comment: + + + + + + + + + + + + + Range + + + Qt::Vertical + + + + 11 + + + 6 + + + + + process all events + + + + + + + selected tracks + + + + + + + inside loop + + + + + + + + + + Function + + + Qt::Vertical + + + + 11 + + + 6 + + + + + + Select + + + + + Quantize + + + + + Delete + + + + + Transform + + + + + Insert + + + + + Copy + + + + + Extract + + + + + + + + Quantize Value + + + + + + + + + + + + + + + + + + Q3GroupBox + +
Qt3Support/Q3GroupBox
+ 1 + +
+ + Q3MultiLineEdit + QWidget +
q3multilineedit.h
+ 1 + +
+ + ComboQuant + +
comboQuant.h
+ 0 + +
+ + Q3ListBox + +
q3listbox.h
+ 0 + +
+
+ + selEventOp + selType + selVal1Op + selVal1a + selVal1b + selVal2Op + selVal2a + selVal2b + selLenOp + selLenA + selLenB + selRangeOp + procEventOp + procType + procVal1Op + procVal1b + procVal2Op + procVal2b + procLenOp + procPosOp + nameEntry + commentEntry + processAll + selectedTracks + insideLoop + funcOp + presetList + buttonNew + buttonDelete + buttonApply + buttonOk + buttonCancel + + + +
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 +#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 @@ + + + + + VelocityBase + + + + 0 + 0 + 275 + 335 + + + + MusE: Modify Velocity + + + + 11 + + + 6 + + + + + Apply To + + + + 6 + + + 3 + + + + + All Events + + + + + + + Selected Events + + + true + + + + + + + Looped Events + + + + + + + Selected AND Looped + + + + + + + + + + Values + + + + 6 + + + 3 + + + + + Rate: + + + + + + + Offset: + + + + + + + % + + + 200 + + + 100 + + + + + + + 127 + + + 1 + + + 1 + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + OK + + + false + + + true + + + + + + + Cancel + + + + + + + + + qPixmapFromMimeSource + + + + okButton + clicked() + VelocityBase + accept() + + + 204 + 362 + + + 59 + 357 + + + + + cancelButton + clicked() + VelocityBase + reject() + + + 322 + 377 + + + 127 + 377 + + + + + 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 @@ + + + + + WaveTrackInfoBase + + + + 0 + 0 + 129 + 548 + + + + + 3 + 3 + 0 + 0 + + + + + 0 + 0 + + + + + 32767 + 32767 + + + + MusE: TrackInfo + + + + + + + + + + 1 + + + 1 + + + + + + 7 + 0 + 0 + 0 + + + + QFrame::WinPanel + + + QFrame::Raised + + + 1 + + + 0 + + + Track Info + + + Qt::AlignCenter + + + + + + + + 7 + 0 + 0 + 0 + + + + Track Name + + + Track Name + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 30 + + + + + + + + + 5 + 0 + 0 + 0 + + + + Track Delay (ticks) + + + off + + + 1000 + + + -1000 + + + + + + + + 5 + 0 + 0 + 0 + + + + Delay (Frames) + + + Delay + + + + + + + qPixmapFromMimeSource + + iName + + + + 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 Binary files /dev/null and b/muse/muse/xpm/filenew.png 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 Binary files /dev/null and b/muse/muse/xpm/fileopen.png 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 Binary files /dev/null and b/muse/muse/xpm/filesave.png 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(<x|yp(g-+", +".jn6z6ukeiC", +"@%@%=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+.", +".+,&@eaf+.", +".+ghi@;>j&@k 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 Binary files /dev/null and b/muse/muse/xpm/muse_icon_64x64.png 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 Binary files /dev/null and b/muse/muse/xpm/splash.png 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 Binary files /dev/null and b/muse/packaging/muse_icon.png 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 0.7.0pre3-1thac +- Updated to latest version + +* Wed May 05 2004 Torbjorn Turpeinen 0.7.0pre2-1thac +- Updated to latest version + +* Tue Apr 20 2004 Torbjorn Turpeinen 0.7.0pre1-1thac +- Updated to latest version + +* Tue Apr 20 2004 Torbjorn Turpeinen 0.6.3-2thac +- Rebuilt against Mandrake 10.0 official + +* Mon Jan 12 2004 Torbjorn Turpeinen 0.6.3-1thac +- Updated to latest version + +* Mon Nov 17 2003 Torbjorn Turpeinen 0.6.2-2thac +- Rebuilt for jackit-0.9.0 + +* Fri Nov 07 2003 Torbjorn Turpeinen 0.6.2-1thac +- Rebuilt for Mandrake 9.2 + +* Thu Oct 30 2003 Torbjorn Turpeinen 0.6.1-1thac +- Rebuilt for Mandrake 9.2 + +* Tue Sep 09 2003 Torbjorn Turpeinen 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 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 0.6.0-1mdk +- Updated to 0.6.0 final built against fluidsynth-1.0.1 + +* Sat May 03 2003 Torbjorn Turpeinen 0.6.0pre8.3mdk +- Rebuilt with rpmmacro patch that removes nvidia dependency. + +* Tue Apr 22 2003 Torbjorn Turpeinen 0.6.0pre8.2mdk +- Rebuilt against latest version of jackit 0.67.2 + +* Fri Apr 04 2003 Torbjorn Turpeinen 0.6.0pre8.1mdk +- Updated to latest version + +* Wed Mar 26 2003 Torbjorn Turpeinen 0.6.0pre7.2mdk +- Rebuilt for Mandrake 9.1 + +* Sun Mar 23 2003 Torbjorn Turpeinen 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 0.6.0pre5.4mdk +- Recompiled against jackit-0.51.0. + +* Fri Feb 14 2003 Torbjorn Turpeinen 0.6.0pre5.3mdk +- Recompiled against libsndfile-1.0.4. + +* Sat Feb 08 2003 Torbjorn Turpeinen 0.6.0pre5.2mdk +- Recompiled against jack-0.44,graphviz and i586 optimized. + +* Wed Dec 11 2002 Torbjorn Turpeinen 0.6.0pre5.1mdk +- Removed jack dependency again + +* Mon Dec 09 2002 Torbjorn Turpeinen 0.6.0pre5mdk +- Rebuilt for Mandrake 9.0 + +* Fri Nov 15 2002 Lenny Cartier 0.6.0-0.pre3.2mdk +- remove jack dependency + +* Wed Nov 13 2002 Lenny Cartier 0.6.0-0.pre3.1mdk +- 0.6.0pre3 +- clean filelist +- disable-suid-build for now +- from James Gregory : + - fixed file locations to use macros rather than absolute paths + +* Thu Oct 3 2002 James Gregory 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) + bufidx = 0; +// bufidx = ++bufidx % bufsize; + return output; + } + void mute() { + for (int i=0; iport[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 +#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= 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 @@ + +
+ 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.
+
+    
+    Copyright (C) 19yy  
+
+    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.
+
+  , 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/share/html/button_bar.jpg b/muse/share/html/button_bar.jpg new file mode 100644 index 00000000..204328c8 Binary files /dev/null and b/muse/share/html/button_bar.jpg 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 @@ + +

MusE - The Linux (Midi) Music Editor

+ +

5. Getting Started

+

+

5.1 Creating A New Song

+

+Here's a very short tutorial on how to create a new song from scratch. + +

+ +

    +
  1. Start MusE with the name of a new song (ie. a filename that doesn't +already exist): +
    +	muse blues1.med
    +
    +Alternatively, start MusE and select File->New. The default song +name is default and the first time you select File->Save, +MusE asks you for a real name. + +
  2. Select a song type from the Type pulldown menu in the +Toolbar. This selects the capabilities of your MIDI hardware (either +NO, GM, GS, or XG). + +
  3. Doubleclick on the first empty track to create a new track. +
  4. 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. +
  5. If the TrackInfo window is not visible, press TrackInfo. +
  6. Select a MIDI instrument for the MIDI channel of your new track. +
  7. Click with the middle mouse button on ruler to set left locator mark. +
  8. Click with the right mouse button on the ruler to set right locator mark. +Note: The right mark must be set to the right of the left mark. +
  9. Double click between the left and right locators on first track to +create a new part, or select the Pencil tool and draw with the left +mouse button pressed to create a new part. +
+ +

+

5.2 Recording Events

+

+Entering Notes Manually + +

    +
  1. Select Pointer tool from toolbar +
  2. Double click on part in part canvas to start the pianoroll editor +
  3. Select Pencil tool from toolbar in the pianoroll editor +
  4. Now you can draw events into the event canvas +
+ +

+Play The Notes + +

    +
  1. Click with middle mouse button on ruler to set left locator mark +
  2. Click with right mouse button on ruler to set right locator mark +
  3. Note: right mark must be set right to left mark +
  4. Click with left mouse button on ruler to set current position between left and right locator +
  5. Select "loop" in the transport toolbar +
  6. Press play to start sequencer +
  7. You can enter new notes while the sequencer is playing +
+ +

+Some Hints + +

    +
  1. You can "play" in realtime on the piano keyboard on the left side of the pianoroll editor +
  2. You can change Channel Info and Track Info values during play +
+ +

+

5.3 Step Recording

+

+

    +
  1. Start the pianoroll editor +
  2. Click with left mouse button on ruler to set current position to the start position of your recording +
  3. Set the Snap value to the step distance +
  4. Set the Quantize value to the length of the notes to record +
  5. Enter step record mode by pressing the "S" toolbar button +
  6. Every click on the piano keyboard records a note with "Quantize" len and advances the current record position to +
  7. The next "Snap" position +
  8. Shift+click records a note without advancing the current record position +
  9. Change the current position with the cursor keys +
  10. Shift+space inserts a gap; all notes to the right of the current position move to the next snap position +
+ +
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 @@ + +

MusE - The Linux Music Editor

+

+

About MusE

+ +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.
+MusE is written by Werner Schweer and others and is published under the + GNU General Public License. +The latest release of MusE can be found at the MusE hompage: +http://muse.sourceforge.net/. + +

+

1. Introduction (still to be written)

+ +

+

2. Installation

+
    +
  • 2.1 How to Obtain MusE +
  • 2.2 System Requirements +
  • 2.3 Compiliation and Installation +
+ +

+

3. Invoking MusE

+
    +
  • 3.1 Invoking MusE +
  • 3.2 Command Line Options +
  • 3.3 File Types Recognized by MusE +
+ +

+

4. Window Reference Guide

+
    +
  • 4.1 The Main Window +
  • 4.2 The Arranger +
  • 4.2.1 The Left Pane +
  • 4.2.1.1 Track Info +
  • 4.2.2 The Right Pane + +
  • 4.3 The Button Bar & Menus +
+ +

+

5. Getting Started

+
    +
  • 5.1 Creating A New Song +
  • 5.2 Recording Events +
  • 5.3 Step Recording +
+ +

+

6. Mixer Automation (still to be written)

+
    +
  • 6.1 Record Automation Events (still to be written) +
+ + +

+

Glossary (still to be written)

+ 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 @@ + +

MusE - The Linux (Midi) Music Editor

+ +

2. Installation

+

+

2.1 How to Obtain MusE

+MusE is available at the MusE Homepage, located at +http://www.muse-sequencer.org/. +Download the latest non-beta release and follow the +installation instructions below. + +

2.2 System Requirements

+To run MusE on your workstation, the following conditions must be met: + + +

2.3 Compiliation and Installation

+Unpack the newly-downloaded tarball into a directory and edit +the file make.inc. +

+The most important variables to set in this file are: +

    +
  • QTDIR +
  • ALSA +
  • OSS +
+ +Point QTDIR to where your QT libraries are installed. +ALSA and OSS are boolean values (ie. yes +or no) that tell MusE how to handle Midi and Audio on your +system. It is safe to say yes to both. +

+A sample config: +

+

+	QTDIR = /usr/local/qt
+	ALSA = no
+	OSS = yes
+
+ +

+When done, save make.inc and run the following commands: +

+	make depend
+	make
+	make install
+
+ +

+Note that make install will ask for the root 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. +

+Hint: To get even better timing than that, run MusE with the -R option. + + 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 @@ + + + MusE: Linux Music Editor + + + + +

MusE - The Linux (Midi) Music Editor

+ +

3. Invoking MusE

+

+

3.1 Invoking MusE

+MusE is invoked from the command line by typing in: +
+	muse
+
+ +Optionally, you can use command line options of the form: + +
+	muse <options> <midifile>
+
+ +<options> : see section 3.2 below for details on options. +<midifile> can be either a standard MIDI file or a MusE +file (*.med, *.med.gz or *.med.bz2). + +

3.2 Command Line Options

+

+MusE accepts some options as listed below: +

+   -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
+
+ +

3.3 File Types Recognized by MusE

+

+ +
~/.MusEMusE Configuration File ("~" refers to your home directory) +
.musePrjHidden Project File; stores list of last projects +
*.medMusE song file; internal MusE format +
*.midmidi file; can be imported +
*.karkaraoke: midi file with additional information; some types can be imported +
+

+With adding the additional extensions .gz or .bz2 +you can read or write compressed files. + + diff --git a/muse/share/html/left_pane.jpg b/muse/share/html/left_pane.jpg new file mode 100644 index 00000000..a659e1ee Binary files /dev/null and b/muse/share/html/left_pane.jpg differ diff --git a/muse/share/html/main_window.jpg b/muse/share/html/main_window.jpg new file mode 100644 index 00000000..eee1e43f Binary files /dev/null and b/muse/share/html/main_window.jpg 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 Binary files /dev/null and b/muse/share/html/main_window_track_info.jpg differ diff --git a/muse/share/html/right_pane.jpg b/muse/share/html/right_pane.jpg new file mode 100644 index 00000000..a770a4e8 Binary files /dev/null and b/muse/share/html/right_pane.jpg 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 Binary files /dev/null and b/muse/share/html/track_info.jpg 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 @@ + +

MusE - The Linux (Midi) Music Editor

+ +

4. Window Reference Guide

+

+

4.1 The Main Window

+Here's a screenshot of the main window, with a standard MIDI file already +loaded: +

+ + +

+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. + +

4.2 The Arranger

+

+The left pane of the Arranger describes each track in detail, +while the right pane describes each track graphically. + +

4.2.1 The Left Pane

+ +

+The left pane details the following information for each track: +

    +
  • A -?? +
  • M - Mute the track +
  • C - Defines whether the track is one of MIDI, Drum or Wave. +
  • Track - A freely-editable track name. +
  • Ch - Defines which MIDI Channel this track plays on. +
  • Port - Defines which MIDI port this track plays on. +
  • T -?? +
+ +You can select which track is currently "active" by simply clicking +on the track. +

+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. +

+Right click on the C column for a track to declare the track to be of +type MIDI, Drum or Wave. +

+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". +

+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. +

+

4.2.1.1 Track Info

+

+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: +

+ +

    +
  • Track Name +
  • Channel +
  • Transpose +
  • Delay +
  • Length +
  • Velocity +
  • Compr +
+The bottom half of the TrackInfo display describes MIDI channel information: +
    +
  • MIDI Instrument +
  • H-Bank +
  • L-Bank +
  • Progr +
  • Volume +
  • Pan +
+ +

+Operations that can be performed on the left pane: + + +
Track Functions  
Select Track +
    +
  • Left Mouse Button +
+
Select multiple Tracks +
    +
  • Shift + Left Mouse Button +
+
Change Selected Track +
    +
  • Key Up: previous Track +
  • Key Down: next Track +
  • click with left mouse button in name field +
+
Move Track +
    +
  • Drag with left Mouse Button +
+
Create New Track +
    +
  • Pulldown Edit
    +
  • Ctrl T +
  • double click in empty track +
+
Delete selected Track(s) +
    +
  • Pulldown Edit +
  • Del +
+
Rename Track +
    +
  • doubleClick with left mouse button + on track name +
+
Change Midi Channel +
    +
  • left mouse button increments midi channel +
  • middle mouse button decrements midi channel +
+
Select Midi Port +
    +
  • click with right mouse button on portname; + select from pulldown menu +
+
Mute Track +
    +
  • click with left mouse button on "M" field in + Tracklist +
+
Solo Track +
    +
  • click "Solo" button +
+
+ + +

4.2.2 The Right Pane

+ +

+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. +

+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. +

+Operations that can be performed on the right pane: +

+ +
To do this......Do this +
Select PartLeft Click +
Select multiple partsShift + left click +
Change selected trackKey left: previous part, Key right: next part +
Move partDrag with left mouse button +
Create new partselect Pencil tool; draw with left mouse button pressed, OR set left and right mark; double click on track +
Delete selected part(s)select rubber tool; click part to delete +
Rename partdouble click with left mouse button on part +
Copy partdrag with shift + left mouse button +
Cut partselect Cut Tool; click on part to cut +
Glue partselect Glue Tool; click on part to glue with next part +
+

+ +

4.2.3 The Button Bar & Menus

+ +

+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. + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ": + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Patch name="Rev.Tom 4" hbank="27" lbank="0" prog="119"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + 0x43 0x10 0x6b 0xa 0x0 0x0 0x0 + + + + 0x43 0x10 0x6b 0xa 0x0 0x1 0x3 + + + + 0x43 0x10 0x6b 0x0 0x0 0x9 0x0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Clave 2424 + SdBrMtSt 2525 + SdBrSwrSt 2626 + SdBrMt2St 2727 + SdBSwrAtSt 2828 + SnLvRolSt 2929 + Castanet 3030 + SdNm1St 3131 + Stick 3232 + BdFkSonSt 3333 + SdBsSt1-3 3434 + BdLoSt 3535 + BdHSonSt 3636 + SdClRmSt 3737 + SdSonSt1-4 3838 + ClapT9 3939 + SdLdwSt1-4 4040 + TomFlSt 4141 + HHClFtSt 4242 + TomLoSt 4343 + HHHlf2St 4444 + TomLoSt 4545 + HHOp2St 4646 + TomMdSt 4747 + TomMdSt 4848 + CrashSt 4949 + TomHiSt 5050 + RideSt 5151 + ChinaSt 5252 + CupSt 5353 + TambrnSw 5454 + SplashSt 5555 + Cowbell2 5656 + CrashRL 5757 + Vibraslap 5858 + RideRL 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaOp 6363 + TumbaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdBlL1-3 8585 + SdLdwSt1-4 8686 + SdBhR1-3 8787 + SdHipSt1-2 8888 + BdLoSt 8989 + SdLdwHMono 9090 + BdR&B1 9191 + SdHeavy 9292 + BdRoom1 9393 + SdAmb 9494 + BdFkSonSt 9595 + BdRoom2 9696 + + + + Clave 2424 + SdBrMtSt 2525 + SdBrSwrSt 2626 + SdBrMt2St 2727 + SdBSwrAtSt 2828 + SnLvRolSt 2929 + Castanet 3030 + SdNm1St 3131 + Stick 3232 + BdFkSt1-2 3333 + SdBsSt2-3 3434 + BdHiSt 3535 + BdNmSt1-2 3636 + SdClRmSt 3737 + SdNmSt1-4 3838 + ClapT9 3939 + SdBsSt1-2 4040 + TomFlSt 4141 + HHClSt1-4 4242 + TomLoSt 4343 + HHPdlSt 4444 + TomLoSt 4545 + HHOpSt 4646 + TomMdSt 4747 + TomMdSt 4848 + CrashSt 4949 + TomHiSt 5050 + RideSt 5151 + ChinaSt 5252 + CupSt 5353 + TambrnSw 5454 + SplashSt 5555 + Cowbell2 5656 + CrashRL 5757 + Vibraslap 5858 + RideRL 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaOp 6363 + TumbaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdBlL1-3 8585 + SdLdwSt1-4 8686 + SdBhR1-3 8787 + SdHipSt1-2 8888 + BdLoSt 8989 + SdLdwHMono 9090 + BdR&B1 9191 + SdHeavy 9292 + BdRoom1 9393 + SdAmb 9494 + BdFkSonSt 9595 + BdRoom2 9696 + + + + AnaClick 2424 + SdBrMtSt 2525 + SdBrSwrSt 2626 + SdBrMt2St 2727 + SdBSwrAtSt 2828 + SdRkRolSt 2929 + Castanet 3030 + SdRkOp1St 3131 + Stick 3232 + BdNmSt1-2 3333 + SdRkRim1St 3434 + BdHiSt 3535 + BdRk1St 3636 + SdRkStk1St 3737 + SdRkOp1St 3838 + HandClapSt 3939 + SdRkMte1St 4040 + TomRkLoSt 4141 + HHClRkStSw 4242 + TomRkLoSt 4343 + HHPdRkStSw 4444 + TomRkMdSt 4545 + HHOpRkStSw 4646 + TomRkMdSt 4747 + TomRkHiSt 4848 + CrashSt 4949 + TomRkHiSt 5050 + RideSt 5151 + ChinaSt 5252 + CupSt 5353 + TambrnRX5 5454 + SplashSt 5555 + Cowbel1 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdRkFlmSt 8585 + SdRkOp2St 8686 + SdRkRim2St 8787 + SdRkMte2St 8888 + BdFk1St 8989 + SdRkRolDSt 9090 + BdHSonSt 9191 + SdLdwSt1-4 9292 + BdFkSonSt 9393 + SdSon3St 9494 + BdFkR1-2 9595 + BdHSonSt 9696 + + + + AnaClick 2424 + SdBrMtSt 2525 + SdBrSwrSt 2626 + SdBrMt2St 2727 + SdBSwrAtSt 2828 + SdRkRolSt 2929 + Castanet 3030 + SdRkOp2St 3131 + Stick 3232 + BdLoSt 3333 + SdRkRim2St 3434 + BdNm2St 3535 + BdRk2St 3636 + SdRkStk2St 3737 + SdRkOp2St 3838 + HandClapSt 3939 + SdRkMte2St 4040 + TomRkLoSt 4141 + HHClRk2St 4242 + TomRkLoSt 4343 + HHHfOpRkSt 4444 + TomRkMdSt 4545 + HHOpRkSt 4646 + TomRkMdSt 4747 + TomRkHiSt 4848 + CrashSt 4949 + TomRkHiSt 5050 + RideSt 5151 + ChinaSt 5252 + CupSt 5353 + TambrnRX5 5454 + SplashSt 5555 + Cowbel1 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdRkFlmSt 8585 + SdRkOp1St 8686 + SdRkRim1St 8787 + SdRkMte1St 8888 + BdRk1St 8989 + SdRkRolDSt 9090 + BdFk2St 9191 + SdLdwSt1-4 9292 + BdHiSt 9393 + SdSon4St 9494 + BdLSonSt 9595 + BdRk1St 9696 + + + + AnaClick 2424 + SdBrMtL 2525 + SdBrSwrL 2626 + SdBrMt2L 2727 + SdBrSwrAtL 2828 + SnLvRolL 2929 + Castanet 3030 + SdLdwL1-4 3131 + Stick 3232 + BdDry1 3333 + SdBh3R 3434 + BdNm2R 3535 + BdRoom3 3636 + SdClRim2 3737 + SdSon3L 3838 + HandClapL 3939 + SdSon4R 4040 + TomFlL 4141 + HHClRk2R 4242 + TomLoL 4343 + HHPdlRkR 4444 + TomMdL 4545 + HHOpRkR 4646 + TomMdL 4747 + TomHiR 4848 + CrashL 4949 + TomHiR 5050 + RideMono 5151 + ChinaSt 5252 + CupMono2 5353 + TambrnSw 5454 + SplashR 5555 + Cowbel1 5656 + CrashL 5757 + Vibraslap 5858 + RideMono 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdClRmR 8585 + SdHeavy 8686 + SdRkRim1R 8787 + SdLdwHMono 8888 + BdRk2L 8989 + SdHipR1-2 9090 + BdBreakHrd 9191 + SdLdw4R 9292 + BdHiL 9393 + SdBhR1-3 9494 + BdFkHL 9595 + BdFkSonL 9696 + + + + SdHpStk2 2424 + VoxHitRev 2525 + TurnTable 2626 + HitBrass 2727 + ScratchSdR 2828 + SnLvRolR 2929 + ClaveT8 3030 + SdHip2R 3131 + SdHpStk6R 3232 + BdHipDp 3333 + SdDodgL 3434 + BdT8-3 3535 + BdT8-2 3636 + SdHpStk2 3737 + SdClpAna 3838 + HandClapR 3939 + SdR&B2 4040 + TomT8 4141 + HHClT8-1 4242 + TomT8 4343 + HHOpT8-1 4444 + TomT8 4545 + HHOpT8-1 4646 + TomT8 4747 + TomT8 4848 + Crash2 4949 + TomT8 5050 + RideR 5151 + CrashT8 5252 + RideT9 5353 + TambrnRX5 5454 + SplashR 5555 + MamboBdy 5656 + CrashT9 5757 + Vibraslap 5858 + RideT9 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoLo 6767 + AgogoHi 6868 + ShakerHip1 6969 + MarcsT8 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + ClaveT8 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + SdHipStk8 8585 + SdJngl3 8686 + HandClapR 8787 + SdHipRm5 8888 + Scratch H 8989 + Scratch L 9090 + ScratchDwn 9191 + ScratchHiR 9292 + ScratchBdF 9393 + ScratchCmb 9494 + ScratchVoR 9595 + BdBreak2 9696 + + + + BdT8-3 2424 + SdT8Rim 2525 + SdHip1 2626 + ClapT9 2727 + SdSyn 2828 + SnLvRolR 2929 + SdHpStk4 3030 + DjembeEd 3131 + SdHpStk6St 3232 + BdT8-1 3333 + SdR&B1Rm 3434 + BdBreakHvy 3535 + BdHipDp 3636 + SdT8-4 3737 + SdHip3 3838 + HandClapSt 3939 + SdLofi 4040 + TomFlR 4141 + HHClLoFi 4242 + TomLoL 4343 + HHClBreak 4444 + TomLoL 4545 + HHOpLoFi 4646 + TomLoL 4747 + TomHiL 4848 + Crash 4949 + TomHiL 5050 + RideT9 5151 + China 5252 + CupMono 5353 + TambrnRX5 5454 + Crash 5555 + CowBelRX11 5656 + CrashR 5757 + CowBelT8 5858 + RideT9 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + RadioNz 6565 + RadioNz 6666 + AgogoLo 6767 + AgogoLo 6868 + Cabasa1 6969 + MarcsT8 7070 + FxGun2 7171 + FxGun1 7272 + ScratchSpn 7373 + ScratchStp 7474 + ClaveT8 7575 + DoorSqk 7676 + HiQ2 7777 + ScratchBdF 7878 + ScratchBdR 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + TambrnHit 8383 + BellTree 8484 + SdHuman2 8585 + SdBreakRol 8686 + StabHard 8787 + SdJngl1 8888 + BdRk1St 8989 + ScratchDwn 9090 + Wataiko 9191 + HH Hit 9292 + StabOrgan2 9393 + Sonar1 9494 + TurnTable 9595 + Police 9696 + + + + SdHipRm4 2424 + HiQ1 2525 + TurnTable 2626 + HitOrch1 2727 + ScratchBdR 2828 + SnLvRolR 2929 + AnaClick 3030 + SdHipRm3 3131 + SdAnCRRim 3232 + BdHipDp 3333 + SdAnSmRim 3434 + BdT8-3 3535 + BdT8-2 3636 + SdT8Rim 3737 + SdHpStk1 3838 + HandClapR 3939 + SdHpStk2 4040 + TomT8 4141 + HHClT8-1 4242 + TomT8 4343 + HHOpT8-1 4444 + TomT8 4545 + HHOpT8-1 4646 + TomT8 4747 + TomT8 4848 + Crash2 4949 + TomT8 5050 + RideR 5151 + CrashT8 5252 + RideT9 5353 + TambrnRX5 5454 + SplashR 5555 + MamboBdy 5656 + CrashT9 5757 + Vibraslap 5858 + RideT9 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + ShakerHip1 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdAnSm 8585 + SdClRim3 8686 + AnaClick 8787 + SdClRim2 8888 + Scratch H 8989 + Scratch L 9090 + ScratchDwn 9191 + ScratchHiR 9292 + ScratchBdF 9393 + ScratchCmb 9494 + ScratchVoR 9595 + BdJngl2 9696 + + + + ClaveT8 2424 + SdT9-5 2525 + TurnTable 2626 + Quiek 2727 + ScratchCb3 2828 + SnLvRolL 2929 + AnaClick 3030 + SdT9Gate 3131 + SdRimSE 3232 + BdT9-3 3333 + SdT9-3 3434 + BdT9-2 3535 + BdT9-1 3636 + SdT9Rim 3737 + SdT9-5 3838 + ClapT9 3939 + SdT9-4 4040 + TomT9Lo 4141 + HHClT9 4242 + TomT9Lo 4343 + HHOpT9 4444 + TomT9Lo 4545 + HHOpT9 4646 + TomT9Lo 4747 + TomT9Hi 4848 + CrashT9 4949 + TomT9Hi 5050 + RideT9 5151 + CrashT9 5252 + RideT9 5353 + TambrnRX5 5454 + CrashT9 5555 + CowBelAnCR 5656 + CrashT9 5757 + Vibraslap 5858 + RideT9 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdT9Rim 8585 + SdT9Gate 8686 + HandClapSt 8787 + SdT9-5 8888 + Scratch H 8989 + Scratch L 9090 + ScratchDwn 9191 + ScratchHiF 9292 + ScratchHiR 9393 + ScratchLoF 9494 + ScratchLoR 9595 + BdT9Hd1 9696 + + + + BdT9Hd3 2424 + SdAnCR 2525 + SdAnSmRim 2626 + SdClpAna 2727 + SdT9Gate 2828 + SdRollMono 2929 + SdTimber 3030 + SdFMRim 3131 + SdJnglFx 3232 + BdVar1 3333 + SdHipRm1 3434 + BdT8-2 3535 + BdZapMid 3636 + SdT8Rim 3737 + SdHipRm2 3838 + HandClapSt 3939 + SdAnCR 4040 + BdT8-3 4141 + HHClT8-2 4242 + BdT8-3 4343 + HHClAnCR 4444 + BdT8-3 4545 + HHOpT8-2 4646 + BdT8-3 4747 + BdT8-3 4848 + Crash 4949 + BdT8-3 5050 + RideT9 5151 + China 5252 + CupMono 5353 + TambrnHit 5454 + Crash 5555 + Cowbel1 5656 + CrashT9 5757 + CowBelT8 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + HiQ1 6565 + HiQ1 6666 + AgogoLo 6767 + AgogoLo 6868 + AnaShaker 6969 + MaracasSlr 7070 + VoxDrum 7171 + VoxDrum 7272 + HiQ1 7373 + HiQ2 7474 + ClaveT8 7575 + HiQ1 7676 + ScratchSpn 7777 + ScratchHiR 7878 + ScratchHiF 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker2 8282 + TambrnHit 8383 + BellTree 8484 + SdBreakRol 8585 + Mother 8686 + VoxBell 8787 + SdR&B1 8888 + VoxAlk 8989 + Udo Hi 9090 + TranCho 9191 + Swarm 9292 + BdPop 9393 + SdR&B1Rm 9494 + BdR&B2 9595 + Crash 9696 + + + + BdRoom1 2424 + AnaClick 2525 + PlayFxABa4 2626 + SdHpStk4 2727 + QuintTip 2828 + PickNoise1 2929 + SdT9Rim 3030 + SdNmSt1-4 3131 + SdR&B1Rm 3232 + BdNmSt1-2 3333 + SdFk3R 3434 + BdT8-3 3535 + BdR&B1 3636 + SdClRim3 3737 + SdPcRim 3838 + HandClapSt 3939 + SdR&B1Rm 4040 + BdT8-3 4141 + HHClT8-2 4242 + BdT8-3 4343 + HHClT8-1 4444 + BdT8-3 4545 + HHOpT8-2 4646 + BdT8-3 4747 + TomT8 4848 + CrashSt 4949 + TomT8 5050 + RideSt 5151 + ChinaSt 5252 + CupSt 5353 + TambrnSw 5454 + Crash 5555 + Cowbel1 5656 + CrashT9 5757 + CowBelT8 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + HiQ1 6565 + HiQ1 6666 + AgogoLo 6767 + AnaShaker 6868 + AnaShaker 6969 + MaracasSlr 7070 + VoxDrum 7171 + VoxDrum 7272 + HiQ1 7373 + HiQ2 7474 + ClaveT8 7575 + HiQ1 7676 + ScratchSpn 7777 + ScratchHiR 7878 + ScratchHiF 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker2 8282 + TambrnHit 8383 + BellTree 8484 + SdLofi 8585 + SdRkStk2St 8686 + SdPicol 8787 + SdR&B2 8888 + BdR&B2 8989 + SdFM 9090 + BdHipDp 9191 + SdHammer 9292 + BdSlimy 9393 + HHHit 9494 + BdT8-3 9595 + TurnTable 9696 + + + + BdT9-2 2424 + SdAnCR 2525 + SdT9-5 2626 + ClapAnSm 2727 + SdT9Gate 2828 + SdRkRolSt 2929 + SdT9-3 3030 + SdT9-4 3131 + SdT9Gate 3232 + BdT9-4 3333 + SdT9-5 3434 + BdT9-1 3535 + BdT9-3 3636 + SdT9Rim 3737 + SdT9-1 3838 + ClapT9 3939 + SdT9-2 4040 + TomT9Lo 4141 + HHClT9 4242 + TomT9Lo 4343 + HHOpT9 4444 + TomT9Lo 4545 + HHOpT9 4646 + TomT9Hi 4747 + TomT9Hi 4848 + CrashT9 4949 + TomT9Hi 5050 + RideT9 5151 + China 5252 + CupMono 5353 + TambrnRX5 5454 + Crash 5555 + Cowbel1 5656 + Crash2 5757 + CowBelT8 5858 + RideR 5959 + CongaT8 6060 + CongaT8 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AnaClick 6767 + CongaT8 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + FxGun2 7171 + FxGun1 7272 + ScratchH 7373 + ScratchDwn 7474 + HiQ1 7575 + HiQ1 7676 + HiQ2 7777 + ScratchL 7878 + ScratchL 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + SdPicol 8585 + SdT8-5 8686 + SdRkRolDSt 8787 + SdBrMt2St 8888 + BdBlpHd 8989 + SdJngl1 9090 + BdSus 9191 + SdD&B1 9292 + BdBreak2 9393 + SdDist 9494 + BdTekPower 9595 + BdDistRM 9696 + + + + BdT8-1 2424 + SdAnCR 2525 + SdT8-4 2626 + SdClpAna 2727 + SdT8-3 2828 + TomT8 2929 + SdT8-5 3030 + BdT8-3 3131 + SdT8-4 3232 + BdT8-2 3333 + SdT8-3 3434 + T8KickBass 3535 + BdT8-1 3636 + SdT8Rim 3737 + SdT8-2 3838 + ClapT9 3939 + SdT8-1 4040 + TomT8 4141 + HHClT8-2 4242 + TomT8 4343 + HHOpT8-1 4444 + TomT8 4545 + HHOpT8-1 4646 + TomT8 4747 + TomT8 4848 + CrashT8 4949 + TomT8 5050 + RideT9 5151 + China 5252 + CupMono 5353 + TambrnRX5 5454 + SplashR 5555 + CowBelT8 5656 + Crash2 5757 + Vibraslap 5858 + RideR 5959 + CongaT8 6060 + CongaT8 6161 + CongaT8 6262 + CongaT8 6363 + CongaT8 6464 + TimbaleHi1 6565 + TimbaleLo1 6666 + Glass 6767 + Glass 6868 + Cabasa1-2 6969 + MarcsT8 7070 + FxGun2 7171 + FxGun1 7272 + AnaShaker 7373 + AnaShaker 7474 + ClaveT8 7575 + HiQ1 7676 + HiQ2 7777 + Scratch L 7878 + Scratch L 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + SdHip1 8585 + SdHip2 8686 + SdHipGate 8787 + SdBreak1 8888 + BdBlip 8989 + SdFx1 9090 + BdFxHmr 9191 + SdHammer 9292 + BdZapHrd 9393 + SdDodgL 9494 + BdTekPower 9595 + BdSlimy 9696 + + + + BdSlimy 2424 + SdT9Rim 2525 + SdT8-5 2626 + ClapT9 2727 + SdT9-3 2828 + SdHuman1 2929 + SdHip3 3030 + SdT9-4 3131 + SdHip2 3232 + BdThkSkn 3333 + SdT9-2 3434 + BdDist4 3535 + BdZapMid 3636 + SdT8Rim 3737 + SdT8-5 3838 + ClapT9 3939 + SdSyn 4040 + TomT8 4141 + HHClLoFi 4242 + TomT8 4343 + HHOpLoFi 4444 + TomT8 4545 + HHOpLoFi 4646 + TomT8 4747 + TomT8 4848 + CrashT8 4949 + TomT8 5050 + RideT9 5151 + Crash 5252 + CupMono 5353 + TambrnAnCR 5454 + CrashL 5555 + CowBelT8 5656 + CrashT9 5757 + CowBelT8 5858 + CrashSyn 5959 + CongaT8 6060 + CongaT8 6161 + CongaT8 6262 + CongaT8 6363 + CongaT8 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + Glass 6767 + Glass 6868 + Cabasa1 6969 + MarcsT8 7070 + FxGun2 7171 + FxGun1 7272 + Scratch H 7373 + ScratchDwn 7474 + HiQ1 7575 + HiQ1 7676 + HiQ2 7777 + Scratch L 7878 + Scratch L 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + DjembeEd 8585 + Wataiko 8686 + StabHard 8787 + HitOrch1 8888 + StabOrgan2 8989 + ScratchDwn 9090 + BdRk1St 9191 + HH Hit 9292 + Wataiko 9393 + Sonar1 9494 + TurnTable 9595 + Police 9696 + + + + BdT9-4 2424 + SdT8Rim 2525 + SdT8-5 2626 + HandClapSt 2727 + SdDodgL 2828 + SnLvRolSt 2929 + SdT9-3 3030 + SdT8-1 3131 + SdT9-5 3232 + BdT9-1 3333 + SdT9Gate 3434 + BdT9-2 3535 + BdT9-3 3636 + SdT9Rim 3737 + SdT9-1 3838 + ClapT9 3939 + SdT9-2 4040 + TomT9Lo 4141 + HHClT8-1 4242 + TomT9Lo 4343 + HHOpT9 4444 + TomT9Lo 4545 + HHOpT9 4646 + TomT9Hi 4747 + TomT9Hi 4848 + CrashT9 4949 + TomT9Hi 5050 + RideT9 5151 + Crash 5252 + CupMono 5353 + TambrnHit 5454 + Crash 5555 + Cowbel1 5656 + CrashSt 5757 + CowBelT8 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TimbaleHi1 6565 + TimbaleHi1 6666 + AgogoLo 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + VoxDrum 7171 + VoxDrum 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + SdBreakRol 8585 + Mother 8686 + VoxBell 8787 + SdR&B1 8888 + VoxAlk 8989 + Udo Hi 9090 + TranCho 9191 + Swarm 9292 + BdPop 9393 + SdR&B1Rm 9494 + BdR&B2 9595 + Crash 9696 + + + + BdT9-2 2424 + SdT8Rim 2525 + PlayFxABa8 2626 + ClapT9 2727 + SdT9-2 2828 + SdT9Gate 2929 + SdHuman2 3030 + SdFx1 3131 + SdLofi 3232 + BdT9Hd2 3333 + SdT9Rim 3434 + BdT9-3 3535 + BdT9Hd1 3636 + SdT9Rim 3737 + SdWood 3838 + NzBurst 3939 + Zap2 4040 + SdSyn 4141 + HHClT9 4242 + SdSyn 4343 + HHOpT9 4444 + SdSyn 4545 + HHOpT9 4646 + SdSyn 4747 + SdSyn 4848 + CrashT9 4949 + SdSyn 5050 + RideT9 5151 + CrashSyn 5252 + CupMono 5353 + TambrnHit 5454 + CrashT8 5555 + Cowbel1 5656 + Crash 5757 + CowBelT8 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaHeel 6262 + CongaSlp 6363 + CongaOp 6464 + TomSyn1 6565 + TomSyn1 6666 + AnaClick 6767 + SdRimSE 6868 + Cabasa1 6969 + MaracasSlr 7070 + VoxDrum 7171 + VoxDrum 7272 + TambrnAnCR 7373 + AnaShaker 7474 + ClaveT8 7575 + TambrnRX5 7676 + CowBelRX11 7777 + AnaShaker 7878 + ScratchHiF 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + TabraBya 8585 + TabraNah 8686 + TablaMut 8787 + VoxBell 8888 + BdPop 8989 + Udo Hi 9090 + BdFXGate 9191 + Mother 9292 + BdT9-1 9393 + SdBreakRol 9494 + Crash 9595 + TurnTable 9696 + + + + BdFXGate 2424 + BongoLo2 2525 + SdGM 2626 + HandClapSt 2727 + SdGate2 2828 + SdRkRolSt 2929 + SdRkRim1St 3030 + SdPicol 3131 + SdRkFlmSt 3232 + BdRoom2 3333 + SdRkStk1St 3434 + BdRoom3 3535 + BdGate 3636 + SdMdRim 3737 + SdGate1 3838 + ClapAnSm 3939 + SdAmb 4040 + TomAmbLo 4141 + HHClD&B 4242 + TomAmbLo 4343 + HHPdlD&B 4444 + TomAmbLo 4545 + HHOpD&B 4646 + TomAmbHi 4747 + TomAmbHi 4848 + CrashSt 4949 + TomAmbHi 5050 + RideSt 5151 + ChinaSt 5252 + CupMono 5353 + TambrnHit 5454 + Crash 5555 + Cowbel1 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + Bd+HH 6565 + Bd+HH 6666 + AgogoLo 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + FxGun2 7171 + FxGun1 7272 + Scratch H 7373 + ScratchDwn 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + Scratch L 7878 + Scratch L 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker2 8282 + SleighBel 8383 + BellTree 8484 + SdDist 8585 + SdFM 8686 + SdFMRim 8787 + SdClappy 8888 + BdRoom3 8989 + SdTimber 9090 + BdRk1St 9191 + SdRimSE 9292 + BdRk2St 9393 + SdBreakRol 9494 + BdD&B1 9595 + BdRoom2 9696 + + + + BdBrkDp 2424 + SdHip1St 2525 + SdLofi 2626 + SdClappy 2727 + SdLdwHMono 2828 + SdRkRolDSt 2929 + SdGate1 3030 + SdMid 3131 + SdBrRim 3232 + BdBreakHvy 3333 + SdHipRm4 3434 + BdBreak2 3535 + BdBreak1 3636 + SdHipRm1 3737 + SdBreak3 3838 + SdBreak1 3939 + SdBreak2 4040 + TomLoSt 4141 + HHClRkSR 4242 + TomLoSt 4343 + HHPdlRkR 4444 + TomLoSt 4545 + HHHlfOpRkR 4646 + TomHiSt 4747 + TomHiSt 4848 + CrashL 4949 + TomHiSt 5050 + RideL 5151 + ChinaL 5252 + CupMono 5353 + TambrnHit 5454 + Crash 5555 + Cowbel1 5656 + CrashR 5757 + CowBelRX11 5858 + RideMono 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + BongoHi1-2 6565 + BongoLo1-3 6666 + CongaOp 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + TimbaleHi1 7171 + TimbaleLo1 7272 + Scratch H 7373 + ScratchDwn 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + Scratch L 7878 + Scratch L 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker2 8282 + SleighBel 8383 + TurnTable 8484 + SdBreakRol 8585 + Mother 8686 + Mind Bell 8787 + SdFx1 8888 + BdRk2St 8989 + LfoSeq 9090 + Ripper 9191 + NzBurst 9292 + Police 9393 + Fairwave 9494 + Swarm 9595 + RadioNz 9696 + + + + BdHipDp 2424 + BongoLo2 2525 + SdR&B2 2626 + SdTimber 2727 + SdD&B3 2828 + SdHammer 2929 + Glass 3030 + BdD&B2 3131 + HHPdlSt 3232 + BdHipDp 3333 + HHOp2St 3434 + BdD&B1 3535 + BdD&B2 3636 + SdMdRim 3737 + SdD&B1 3838 + NzBurst 3939 + SdD&B2 4040 + TomAmbLo 4141 + HHClD&B 4242 + TomAmbLo 4343 + HHPdlD&B 4444 + TomAmbLo 4545 + HHOpD&B 4646 + TomAmbHi 4747 + TomAmbHi 4848 + CrashL 4949 + TomAmbHi 5050 + RideSt 5151 + China 5252 + CupMono 5353 + TambrnHit 5454 + Crash 5555 + Cowbel1 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + SdD&B4 6565 + HHRvD&B 6666 + AgogoLo 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + FxGun2 7171 + FxGun1 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + Sine 7676 + Sine 7777 + P50-1 7878 + PlyFxSl17S 7979 + TurnTable 8080 + TriangleOp 8181 + Shaker2 8282 + SleighBel 8383 + BellTree 8484 + SdDist 8585 + SdFM 8686 + SdFMRim 8787 + SdClappy 8888 + BdD&B1 8989 + SdTimber 9090 + BdDist5 9191 + SdRimSE 9292 + BdDist4 9393 + SdHip3 9494 + BdSlimy 9595 + Bd+HH 9696 + + + + BdATite 2424 + SdT8Rim 2525 + SdJngl3 2626 + HandClapSt 2727 + SdT8-1 2828 + SnLvRolSt 2929 + SdBhL1-3 3030 + SdBh3R 3131 + SdSonSt1-3 3232 + BdFkSt1-2 3333 + SdBsSt1-3 3434 + BdNm1R 3535 + BdFkHL 3636 + SdRkStk2R 3737 + SdLdwR1-4 3838 + ClapT9 3939 + SdLdwL1-4 4040 + TomT9Lo 4141 + HHClRkSR 4242 + TomT9Lo 4343 + HHClRk2R 4444 + TomT9Lo 4545 + HHHlfOpRkR 4646 + TomT9Hi 4747 + TomT9Hi 4848 + CrashL 4949 + TomT9Hi 5050 + RideR 5151 + Crash 5252 + CupL 5353 + TambrnHit 5454 + Crash 5555 + Cowbel1 5656 + CrashL 5757 + CowBelT8 5858 + RideMono 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TimbaleHi1 6565 + TimbaleHi1 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + FxGun2 7171 + FxGun1 7272 + Scratch H 7373 + ScratchDwn 7474 + HiQ1 7575 + HiQ1 7676 + HiQ2 7777 + Scratch L 7878 + Scratch L 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + SdT9-5 8585 + SdT9-5 8686 + SdT9-5 8787 + SdT9-5 8888 + BdFkSt1-2 8989 + SdD&B1 9090 + BdHSonSt 9191 + SdHipGate 9292 + BdFXGate 9393 + SdBreak1 9494 + BdJngl1 9595 + BdBreakHvy 9696 + + + + BdJngl2 2424 + SdMdRim 2525 + SdJngl3 2626 + SdJngl3 2727 + SdPcRim 2828 + SdRollMono 2929 + SdWood 3030 + SdR&B2 3131 + SdD&B2 3232 + BdJngl2 3333 + SdJnglFx 3434 + BdJngl3 3535 + BdJngl1 3636 + SdHipRm4 3737 + SdJngl2 3838 + SdJnglFx 3939 + SdJngl1 4040 + TomFlL 4141 + HHClRkRSw 4242 + TomLoL 4343 + HHPdlRkRSw 4444 + TomMdR 4545 + HHOpRkRSw 4646 + TomMdR 4747 + TomHiR 4848 + CrashL 4949 + TomHiR 5050 + RideR 5151 + China 5252 + CupMono 5353 + TambrnHit 5454 + Crash 5555 + Cowbel1 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TabraNah 6565 + TabraBya 6666 + AgogoLo 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + TimbaleHi1 7171 + TimbaleLo1 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker2 8282 + SleighBel 8383 + BellTree 8484 + HHRvD&B 8585 + RainLoop 8686 + Scratch H 8787 + Scratch L 8888 + BdBlpHd 8989 + SdSyn 9090 + IndusTom 9191 + PandieroOp 9292 + Ripper 9393 + TelRing 9494 + ScratchLoR 9595 + TapeRewnd 9696 + + + + BdAnCR 2424 + BdBlip 2525 + SdT8-5 2626 + ClapAnSm 2727 + SdHipRm2 2828 + SdRollMono 2929 + SdT8-1 3030 + SdAnCR 3131 + SdT8-2 3232 + BdT8-1 3333 + SdT8-4 3434 + BdBlip 3535 + BdT8-2 3636 + SdT8Rim 3737 + SdT8-3 3838 + ClapT9 3939 + ClapAnSm 4040 + TomSyn2 4141 + HHClT8-2 4242 + TomSyn2 4343 + HHOpT8-1 4444 + TomSyn2 4545 + HHOpT8-2 4646 + TomSyn2 4747 + TomSyn2 4848 + CrashT9 4949 + TomSyn2 5050 + RideT9 5151 + Crash 5252 + CrashSyn 5353 + CrashT8 5454 + Crash 5555 + SdRimSE 5656 + CrashSt 5757 + CowBelT8 5858 + CrashSyn 5959 + TomT8 6060 + TomT8 6161 + TomT8 6262 + TomT8 6363 + TomT8 6464 + Applause 6565 + Telephone 6666 + Heartbeat 6767 + Bomb 6868 + HHOpLoFi 6969 + MaracasSlr 7070 + Zap2 7171 + Zap1 7272 + Scratch H 7373 + ScratchDwn 7474 + HiQ1 7575 + HiQ1 7676 + HiQ2 7777 + Scratch L 7878 + HitOrch2 7979 + HHClFx 8080 + HHOpFx 8181 + AnaShaker 8282 + AnaShaker 8383 + TurnTable 8484 + SdBreakRol 8585 + Mother 8686 + Mind Bell 8787 + SdFx1 8888 + BdRk2St 8989 + LfoSeq 9090 + Ripper 9191 + NzBurst 9292 + Police 9393 + Fairwave 9494 + Swarm 9595 + RadioNz 9696 + + + + BdHuman1 2424 + ScratchVoF 2525 + Hit Uhh 2626 + ScratchVoR 2727 + SdJnglFx 2828 + SdRkRolSt 2929 + SdBreak1 3030 + SdAnCR 3131 + SdT9-1 3232 + BdSus 3333 + SdHpStk1 3434 + BdHuman1 3535 + BdHuman2 3636 + SdWood 3737 + SdHuman1 3838 + SdDodgH 3939 + SdHuman2 4040 + BdHuman1 4141 + HHOpHuman 4242 + BdHuman1 4343 + HHOpHuman 4444 + BdHuman1 4545 + HHOpHuman 4646 + BdHuman1 4747 + BdHuman1 4848 + NzBurst 4949 + BdHuman1 5050 + CrashT8 5151 + China 5252 + CupMono 5353 + ScratchSdR 5454 + SplashSt 5555 + VoxDrum 5656 + Crash2 5757 + CowBelT8 5858 + StabAah 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoLo 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + FxGun2 7171 + FxGun1 7272 + Scratch H 7373 + ScratchDwn 7474 + ScratchLoF 7575 + ScratchLoR 7676 + HiQ2 7777 + Scratch L 7878 + Scratch L 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker2 8282 + SleighBel 8383 + TurnTable 8484 + SdRkRim1R 8585 + Helicopter 8686 + StabHard 8787 + SdGate1 8888 + BdRk1St 8989 + ScratchDwn 9090 + BdAnSm 9191 + Sonar1 9292 + Wataiko 9393 + Wataiko 9494 + HH Hit 9595 + StabOrgan2 9696 + + + + BdDist3 2424 + SdWood 2525 + SdGate1 2626 + HandClapSt 2727 + SdGate2 2828 + SdRollMono 2929 + SdClpAna 3030 + SdHip3 3131 + Ripper 3232 + BdDistRM 3333 + SdT8Rim 3434 + BdDist2 3535 + BdDist1 3636 + SdMdRim 3737 + SdDist 3838 + NzBurst 3939 + SdFx2 4040 + TomDistLo 4141 + HHClT9 4242 + TomDistLo 4343 + HHOpT9 4444 + TomDistLo 4545 + HHOpT9 4646 + TomDistHi 4747 + TomDistHi 4848 + CrashT9 4949 + TomDistHi 5050 + RideT9 5151 + China 5252 + CupMono 5353 + TambrnAnCR 5454 + Crash 5555 + CowBelT8 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + SdTimber 6060 + SdTimber 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + Bd+HH 6565 + Bd+HH 6666 + Glass 6767 + Glass 6868 + Cabasa1 6969 + MaracasSlr 7070 + FxGun2 7171 + FxGun1 7272 + Scratch H 7373 + ScratchDwn 7474 + HiQ1 7575 + HiQ1 7676 + HiQ2 7777 + Scratch L 7878 + Scratch L 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + SdDist 8585 + SdFM 8686 + SdFMRim 8787 + SdClappy 8888 + BdFxHmr 8989 + IndusTom 9090 + BdD&B1 9191 + IndusTom 9292 + BdRoom3 9393 + IndusTom 9494 + BdT9-4 9595 + SdHammer 9696 + + + + AnaClick 2424 + SdBrMtSt 2525 + SdBrSwrSt 2626 + SdBrMt2St 2727 + SdBSwrAtSt 2828 + SnLvRolSt 2929 + Castanet 3030 + SdNm1St 3131 + Stick 3232 + BdRk2R 3333 + SdLdw1St 3434 + BdBreak1 3535 + BdRk2R 3636 + SdRkStk2R 3737 + SdSon1L 3838 + HandClapL 3939 + SdPcRim 4040 + TomAmbLo 4141 + HHClRk2R 4242 + TomAmbLo 4343 + HHPdlRkR 4444 + TomAmbLo 4545 + HHOpRkR 4646 + TomAmbHi 4747 + TomAmbHi 4848 + CrashL 4949 + TomAmbHi 5050 + RideR 5151 + ChinaL 5252 + CupR 5353 + TambrnSw 5454 + SplashR 5555 + MamboBel 5656 + CrashL 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + Cabasa1-2 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + ScratchCb2 7878 + ScratchHiR 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdPicol 8585 + SdHeavy 8686 + SdClpAna 8787 + SdPcRim 8888 + BdRoom2 8989 + SdMid 9090 + BdRoom3 9191 + SdMdRim 9292 + BdGate 9393 + SdGate1 9494 + BdFXGate 9595 + BdD&B1 9696 + + + + BdBlip 2424 + HiQ2 2525 + SdPcRim2 2626 + HiQ1 2727 + SdAnCR 2828 + TomSyn1 2929 + HHClSyn 3030 + TomSyn1 3131 + HHClFx 3232 + TomSyn2 3333 + HHOpSyn 3434 + BdAnCR 3535 + BdT9-1 3636 + SdHpStk3 3737 + SdJngl1 3838 + ClapT9 3939 + SdJngl1 4040 + TomT8 4141 + HHClT8-2 4242 + TomT8 4343 + HHOpT8-1 4444 + TomT8 4545 + HHOpT8-2 4646 + TomT8 4747 + TomT8 4848 + CrashSyn 4949 + TomT8 5050 + RideT9 5151 + Crash 5252 + CupMono 5353 + TambrnHit 5454 + Crash 5555 + CowBelT8 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + Glass 6767 + Glass 6868 + Cabasa1 6969 + MarcsT8 7070 + Bird 7171 + Stream 7272 + Thunder 7373 + Gunshot 7474 + ClaveT8 7575 + WoodBlock 7676 + WoodBlock 7777 + TambrnAnCR 7878 + CowBelAnCR 7979 + TriangleMt 8080 + TriangleOp 8181 + AnaShaker 8282 + SleighBel 8383 + BellTree 8484 + SdT8-5 8585 + Sonar1 8686 + SdT8-5 8787 + Resonator 8888 + Bubble 8989 + SdT8-5 9090 + Bubble 9191 + SdT8-5 9292 + Eery 9393 + SdT8-5 9494 + WindChime 9595 + WindChime 9696 + + + + BdRoom2 2424 + SdBrMtR 2525 + SdBSwrAtSt 2626 + SdBrMt2St 2727 + SdBSwrAtSt 2828 + SnLvRolSt 2929 + Castanet 3030 + SdHip1St 3131 + Stick 3232 + BdFkML 3333 + SdRkStk2St 3434 + BdFkSonSt 3535 + BdFkSt1-2 3636 + SdClRmSt 3737 + SdLdw1St 3838 + HandClapSt 3939 + SdBhSt1-3 4040 + TomFlSt 4141 + HHClFtSt 4242 + TomFlSt 4343 + HHPdlSt 4444 + TomLoSt 4545 + HHOp2St 4646 + TomMdSt 4747 + TomMdSt 4848 + CrashSt 4949 + TomHiSt 5050 + RideSt 5151 + ChinaSt 5252 + CupSt 5353 + TambrnHit 5454 + SplashSt 5555 + Cowbel1 5656 + CrashSt 5757 + Vibraslap 5858 + RideSt 5959 + BongoHi1 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TimbaleHi1 6565 + TimbaleHi1 6666 + AgogoLo 6767 + AgogoLo 6868 + Cabasa1 6969 + MaracasSlr 7070 + SdBrSwrSt 7171 + SdBrSwrSt 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker2 8282 + SleighBel 8383 + BellTree 8484 + SdBlL1-3 8585 + SdFkAySt 8686 + SdBhR1-3 8787 + SdBlSt1-2 8888 + BdLoL 8989 + SdLdwHMono 9090 + BdDry2 9191 + SdBSwrAtSt 9292 + BdSlimy 9393 + SdRollMono 9494 + BdNm2R 9595 + Crash 9696 + + + + SdT8Rim 2424 + VoxHitRev 2525 + TurnTable 2626 + StabHard 2727 + ScratchVoR 2828 + SdRollMono 2929 + ClaveT8 3030 + SdHip1R 3131 + SdHpStk4 3232 + BdAnCR 3333 + SdHipRm3 3434 + BdT9-3 3535 + BdHipDp 3636 + SdHpStk5 3737 + SdHipGate 3838 + HandClapR 3939 + SdLofi 4040 + TomT8 4141 + HHClHip 4242 + TomT8 4343 + HHPdlHip 4444 + TomT8 4545 + HHOpHip 4646 + TomT8 4747 + TomT8 4848 + Crash2 4949 + TomT8 5050 + RideR 5151 + CrashT8 5252 + RideT9 5353 + TambrnRX5 5454 + SplashR 5555 + MamboBdy 5656 + CrashT9 5757 + Vibraslap 5858 + RideT9 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + ShakerHip1 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdHpStk1 8585 + SdJngl1 8686 + HandClapR 8787 + SdBreakHvy 8888 + Scratch L 8989 + ScratchDwn 9090 + ScratchHiF 9191 + ScratchLoF 9292 + ScratchLoR 9393 + ScratchBdF 9494 + ScratchBdR 9595 + BdBreakHvy 9696 + + + + SdHpStk2 2424 + HiQ2 2525 + TurnTable 2626 + HitOrch1 2727 + ScratchSpn 2828 + SdRkRolR 2929 + ClaveT8 3030 + SdBreak3 3131 + SdHpStk7 3232 + BdR&B2 3333 + SdR&B1Rm 3434 + BdT9-4 3535 + BdT9-2 3636 + SdHpStk3 3737 + SdHipRm3 3838 + HandClapR 3939 + SdHipRm4 4040 + BdT8-3 4141 + HHClT9 4242 + BdT8-3 4343 + HHOpT9 4444 + BdT8-3 4545 + HHOpT9 4646 + BdT8-3 4747 + BdT8-3 4848 + Crash2 4949 + BdT8-3 5050 + RideR 5151 + CrashT8 5252 + RideT9 5353 + TambrnRX5 5454 + SplashR 5555 + MamboBdy 5656 + CrashT9 5757 + Vibraslap 5858 + RideT9 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + ShakerHip1 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdClRmSt 8585 + SdJnglFx 8686 + HandClapR 8787 + SdBreakRol 8888 + ScratchHiR 8989 + ScratchLoF 9090 + ScratchLoR 9191 + ScratchBdF 9292 + ScratchBdR 9393 + ScratchSdF 9494 + ScratchSdR 9595 + BdBreakHrd 9696 + + + + SdHipRm4 2424 + NzBurst 2525 + TurnTable 2626 + Hit Uhh 2727 + ScratchBdR 2828 + SnLvRolR 2929 + ClaveT8 3030 + SdAnSmRim 3131 + SdHipGate 3232 + BdT9-3 3333 + SdT8Rim 3434 + BdT8-2 3535 + BdT9-1 3636 + SdHipRm3 3737 + SdHpStk3 3838 + HandClapR 3939 + SdHpStk4 4040 + TomT9Lo 4141 + HHClT9 4242 + TomT9Lo 4343 + HHOpT9 4444 + TomT9Lo 4545 + HHOpT9 4646 + TomT9Hi 4747 + TomT9Hi 4848 + Crash2 4949 + TomT9Hi 5050 + RideR 5151 + CrashT8 5252 + RideT9 5353 + TambrnRX5 5454 + SplashR 5555 + MamboBdy 5656 + CrashT9 5757 + Vibraslap 5858 + RideT9 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + ShakerHip1 6969 + MaracasSlr 7070 + Whistle 7171 + Whistle 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + CuicaHi 7878 + CuicaLo 7979 + TriangleMt 8080 + TriangleOp 8181 + Shaker1-2 8282 + SleighBel 8383 + BellTree 8484 + SdAnSmRim 8585 + SdClRmR 8686 + SdHipRm4 8787 + SdClRim3 8888 + Scratch L 8989 + ScratchDwn 9090 + ScratchHiF 9191 + ScratchLoF 9292 + ScratchBdR 9393 + ScratchCb2 9494 + ScratchStp 9595 + BdBlpHd 9696 + + + + BdHardLong 2424 + BdT9-1 2525 + BdSlimy 2626 + BdAnHard 2727 + BdDist4 2828 + BdR&B2 2929 + BdHipDp 3030 + BdFxHmr 3131 + BdT9Hd1 3232 + BdT8-3 3333 + BdSus 3434 + BdZapMid 3535 + BdT8-2 3636 + BdSlimy 3737 + SdT8-1 3838 + SdT8Rim 3939 + SdClappy 4040 + SdBl3St 4141 + HHOpSt 4242 + HHClT8-2 4343 + HHOpSt 4444 + HHOpT8-2 4545 + HHOpSt 4646 + HHOpT8-2 4747 + ClapAnSm 4848 + CrashSt 4949 + CrashT9 5050 + RideSt 5151 + RideT9 5252 + AnaClick 5353 + ClaveT8 5454 + ClapAnSm 5555 + ClapT9 5656 + AnaShaker 5757 + CongaT8 5858 + CongaT8 5959 + SdAnCR 6060 + SdRkRolSt 6161 + AgogoHi 6262 + ChinaRL 6363 + HiQ2 6464 + HiQ1 6565 + Zap2 6666 + Zap1 6767 + Zap2 6868 + DoorSqk 6969 + ScratchCb3 7070 + FretNoise 7171 + PlayFxGt5 7272 + ScratchHiF 7373 + Wurli+ 7474 + Wurli+ 7575 + Wurli+ 7676 + ResoXFade 7777 + Sonar1 7878 + VoxDrum 7979 + VoxDrum 8080 + VoxDrum 8181 + HHOpSyn 8282 + HHClSyn 8383 + TriWv 8484 + TriWv 8585 + TriWv 8686 + TriWv 8787 + TriWv 8888 + TriWv 8989 + TriWv 9090 + TriWv 9191 + TriWv 9292 + TriWv 9393 + TriWv 9494 + TriWv 9595 + TriWv 9696 + + + + BdHardLong 2424 + BdTekPower 2525 + BdDist5 2626 + BdDist3 2727 + BdDist1 2828 + BdD&B1 2929 + BdBlip 3030 + BdAnSm 3131 + BdT8-2 3232 + BdT8-1 3333 + BdT9Hd3 3434 + BdT9-2 3535 + BdT9-3 3636 + BdSus 3737 + SdT9-1 3838 + SdT9Rim 3939 + SdT9-4 4040 + TomT9Lo 4141 + HHClT9 4242 + TomT9Lo 4343 + HHOpT9 4444 + TomT9Lo 4545 + HHOpT9 4646 + ClapT9 4747 + ClapAnSm 4848 + CrashT9 4949 + CongaT8 5050 + RideT9 5151 + CongaT8 5252 + AnaClick 5353 + ClaveT8 5454 + MarcsT8 5555 + TambrnAnCR 5656 + AnaShaker 5757 + CowBelT8 5858 + CowBelAnCR 5959 + SdT8-1 6060 + SdT8-2 6161 + SdT8-3 6262 + SdAnCR 6363 + SdJngl1 6464 + SdD&B1 6565 + SdD&B4 6666 + SdR&B1 6767 + SdR&B2 6868 + SdHip1 6969 + SdWood 7070 + SdTimber 7171 + HHClT8-1 7272 + HHOpT8-1 7373 + HHClT8-2 7474 + HHOpT8-2 7575 + HHPdlSt 7676 + HHOpSt 7777 + HHOpSt 7878 + HHClLoFi 7979 + HHOpLoFi 8080 + HHClSyn 8181 + HHOpSyn 8282 + AnaShaker 8383 + TambrnRX5 8484 + TambrnSw 8585 + Cowbell2 8686 + BongoHi1 8787 + TimbaleHi1 8888 + WoodBlock 8989 + BdHardLong 9090 + TumbaOp 9191 + QuintOp 9292 + FxGun2 9393 + Bomb 9494 + BdZapHrd 9595 + ScratchHp2 9696 + + + + BdNmSt1-2 2424 + SdRkStk1St 2525 + SdRkOp2St 2626 + SdRkRolSt 2727 + SdRkOp1St 2828 + TomLoSt 2929 + HHClFtSt 3030 + TomLoSt 3131 + HHPdlSt 3232 + TomMdSt 3333 + HHOpSt 3434 + TomHiSt 3535 + BdRk2St 3636 + SdRkStk1St 3737 + SdRkOp2St 3838 + HandClapSt 3939 + SdRkMte2St 4040 + TomRkLoSt 4141 + HHClRkStSw 4242 + TomRkLoSt 4343 + HHPdRkStSw 4444 + TomRkMdSt 4545 + HHOpRkStSw 4646 + TomRkMdSt 4747 + TomRkHiSt 4848 + CrashSt 4949 + TomRkHiSt 5050 + RideSt 5151 + ChinaSt 5252 + CupSt 5353 + TambrnSw 5454 + SplashSt 5555 + Cowbel1 5656 + CrashSt 5757 + Shaker1-2 5858 + RideSt 5959 + BdRk1St 6060 + SdRkStk2St 6161 + SdRkOp1St 6262 + ClapT9 6363 + SdRkMte1St 6464 + TomRkLoSt 6565 + HHClRkStSw 6666 + TomRkLoSt 6767 + HHPdlRkSt 6868 + TomRkMdSt 6969 + HHHfOpRkSt 7070 + TomRkMdSt 7171 + TomRkHiSt 7272 + CrashSt 7373 + TomRkHiSt 7474 + RideL 7575 + ChinaSt 7676 + CupSt 7777 + TambrnHit 7878 + SplashSt 7979 + MamboBel 8080 + CrashSt 8181 + ShekereDw 8282 + RideR 8383 + BdFkSt1-2 8484 + SdRkStk1St 8585 + SdRkRim1St 8686 + SdRkFlmSt 8787 + SdRkRim2St 8888 + TomFlSt 8989 + HHCl4St 9090 + TomLoSt 9191 + HHPdlSt 9292 + TomMdSt 9393 + HHOp2St 9494 + TomMdSt 9595 + TomHiSt 9696 + + + + BdT8-3 2424 + SdT8Rim 2525 + SdDodgL 2626 + ClapT9 2727 + SdHip3 2828 + BdT8-3 2929 + HHClTek 3030 + BdT8-3 3131 + HHOpTek 3232 + BdT8-3 3333 + HHOpTek 3434 + BdT8-3 3535 + BdHipDp 3636 + SdHpStk4 3737 + SdHipRm1 3838 + HandClapR 3939 + SdHip2 4040 + TomT8 4141 + HHClT8-2 4242 + TomT8 4343 + HHOpAnCR 4444 + TomT8 4545 + HHOpT8-1 4646 + TomT8 4747 + TomT8 4848 + CrashT9 4949 + TomT8 5050 + CrashSyn 5151 + CrashSyn 5252 + CrashT8 5353 + TambrnRX5 5454 + SplashR 5555 + CowBelT8 5656 + CrashT9 5757 + CowBelAnCR 5858 + RideT9 5959 + BdHipDp 6060 + SdHpStk5 6161 + SdHipRm2 6262 + HandClapL 6363 + SdHip1 6464 + TomT9Lo 6565 + HHClRX5 6666 + TomT9Lo 6767 + HHClAnCR 6868 + TomT9Lo 6969 + HHOpT8-2 7070 + TomT9Lo 7171 + TomT9Hi 7272 + CrashR 7373 + TomT9Hi 7474 + CrashT8 7575 + CrashSyn 7676 + CrashT8 7777 + TambrnHit 7878 + ChinaR 7979 + CowBelRX11 8080 + CrashL 8181 + Cowbel1 8282 + RideR 8383 + BdHipDp 8484 + SdHipStk8 8585 + SdHipGate 8686 + SdHip2 8787 + SdHipRm5 8888 + TomDistLo 8989 + HHClHip 9090 + TomDistLo 9191 + HHPdlHip 9292 + TomDistHi 9393 + HHOpHip 9494 + TomDistHi 9595 + TomAnSm 9696 + + + + Wataiko 2424 + Udo Hi 2525 + DjembeOp 2626 + QuintTip 2727 + Udo Low 2828 + UdoFinger 2929 + Udo Hi 3030 + TabraBya 3131 + TmbourimOp 3232 + TablaMut 3333 + TabraNah 3434 + TablaMut 3535 + Timpani 3636 + Hit Uhh 3737 + PickNoise1 3838 + ClapT9 3939 + TriangleMt 4040 + TriangleOp 4141 + Castanet 4242 + Castanet 4343 + Castanet 4444 + GuiroLong 4545 + GuiroShort 4646 + GuiroSwp 4747 + Vibraslap 4848 + Clave 4949 + ClaveT8 5050 + CuicaLo 5151 + CuicaHi 5252 + TmbaleL1-3 5353 + WoodBlock 5454 + TimbaleLo2 5555 + WoodBlock 5656 + TmbaleH1-3 5757 + ChaCha 5858 + TimbaleHi2 5959 + TmblPailaL 6060 + TmblPailaL 6161 + TmblPailaH 6262 + MamboBel 6363 + BongoLo1-3 6464 + BongoLo3 6565 + Cowbel1 6666 + BongoHi1-2 6767 + Cowbell2 6868 + BongoHHeel 6969 + AgogoLo 7070 + AgogoHi 7171 + TumbaHeel 7272 + TumbaTip 7373 + TumbaSlp 7474 + MaracasSlr 7575 + TumbaOp 7676 + CongaHeel 7777 + CongaTip 7878 + CongaSlp 7979 + Shaker1 8080 + CongaOp 8181 + Cabasa1 8282 + Cabasa1-2 8383 + QuintHeel 8484 + QuintTip 8585 + QuintSlp 8686 + Shaker2 8787 + QuintOp 8888 + Caxixi1 8989 + TambrnShk 9090 + TambrnHit 9191 + TambrnSw 9292 + TambrnHit 9393 + SleighBel 9494 + Whistle 9595 + Whistle 9696 + + + + BdLSonSt 2424 + SdRkStk2St 2525 + SdFkSt1/3 2626 + CrashSt 2727 + SplashSt 2828 + TomLoSt 2929 + HHClSt1-4 3030 + TomLoSt 3131 + HHPdlSt 3232 + TomMdSt 3333 + HHOpSt 3434 + TomHiSt 3535 + TumbaTip 3636 + TumbaHeel 3737 + TumbaSlp 3838 + Clave 3939 + TumbaOp 4040 + CongaTip 4141 + CongaHeel 4242 + CongaSlp 4343 + ChaCha 4444 + CongaOp 4545 + MamboBdy 4646 + MamboBel 4747 + QuintTip 4848 + QuintHeel 4949 + QuintSlp 5050 + ChaCha 5151 + QuintOp 5252 + BongoLo1 5353 + BongoHHeel 5454 + BongoHi1 5555 + TimbaleLo1 5656 + TmblPailaL 5757 + TimbaleHi1 5858 + TmblPailaH 5959 + WoodBlock 6060 + WoodBlock 6161 + ShekereDw 6262 + ShekereUp 6363 + ShekereSap 6464 + MaracasSlr 6565 + MaracasStc 6666 + GuiroLong 6767 + GuiroShort 6868 + GuiroSwp 6969 + SurdoMt 7070 + SurdoOp 7171 + PandierTip 7272 + PandroHeel 7373 + PandierThm 7474 + PandieroOp 7575 + TmbourmFng 7676 + TmbourimMt 7777 + TmbourimOp 7878 + AgogoLoTap 7979 + AgogoLo 8080 + AgogoHi 8181 + TriangleOp 8282 + TriangleMt 8383 + GanzaAc 8484 + GanzaBk 8585 + GanzaFw 8686 + Cabasa1 8787 + Cabasa2 8888 + Caxixi1 8989 + Caxixi2 9090 + CuicaLo 9191 + CuicaHi 9292 + Whistle 9393 + Whistle 9494 + Vibraslap 9595 + BellTree 9696 + + + + PlayFxABa8 2424 + PlayFxABa8 2525 + PlayFxGt4 2626 + PwrChdMono 2727 + PwrChdMono 2828 + PlayFxABa9 2929 + PickNoise2 3030 + PlayFxABa6 3131 + PickNoise2 3232 + PlayFxABa6 3333 + PlayFxGt7 3434 + PlyFxSlp1H 3535 + PlyFxSl12S 3636 + PlayFxABa4 3737 + PlayFxGt3 3838 + PlayFxABa9 3939 + PlayFxGt5 4040 + PlyFxSlp2S 4141 + PickNoise2 4242 + PlyFxSlp2S 4343 + PickNoise2 4444 + PlyFxSlp2S 4545 + FretNoise 4646 + PlyFxSlp2S 4747 + PlyFxSlp2S 4848 + PlyFxSl19S 4949 + PlyFxSlp2S 5050 + PickNoise2 5151 + PlyFxSl19S 5252 + PickNoise2 5353 + PlyFxSlp2H 5454 + PlyFxSl19S 5555 + PlayFxGt12 5656 + PlyFxSl19S 5757 + PlyFxSl18S 5858 + PickNoise2 5959 + PlayFxABa4 6060 + PlayFxABa4 6161 + PlayFxABa2 6262 + PlayFxABa3 6363 + PlayFxABa1 6464 + PlayFxABa8 6565 + PlayFxABa8 6666 + PlayFxABa8 6767 + PlayFxABa8 6868 + PlayFxGt6 6969 + PlayFxGt4 7070 + PlayFxGt13 7171 + PlayFxGt12 7272 + PlayFxABa5 7373 + PlayFxABa6 7474 + PickNoise1 7575 + PickNoise1 7676 + PickNoise3 7777 + PlayFxGt7 7878 + PlayFxGt8 7979 + PickNoise2 8080 + PickNoise2 8181 + PlayFxGt3 8282 + PlyFxSl18S 8383 + PlayFxGt9 8484 + PlayFxGt10 8585 + PlayFxGt11 8686 + PlayFxGt1 8787 + PlayFxGt2 8888 + PlayFxGt3 8989 + PlayFxGt4 9090 + PlyFxSl17S 9191 + PlyFxSlp7H 9292 + PlyFxSlp7S 9393 + PlyFxSl18H 9494 + PlyFxSl19S 9595 + PlyFxSl20S 9696 + + + + PlyFxSlp5H 2424 + PickNoise1 2525 + HHPdlD&B 2626 + HandClapL 2727 + ScratchVoF 2828 + IndusTom 2929 + SdWood 3030 + IndusTom 3131 + SdClpAna 3232 + IndusTom 3333 + SdFMRim 3434 + BdFXGate 3535 + BdFxHmr 3636 + PlayFxABa4 3737 + SdFM 3838 + HandClapL 3939 + SdTimber 4040 + TomSyn2 4141 + HHClSyn 4242 + TomSyn2 4343 + HHOpSyn 4444 + TomSyn2 4545 + HHOpSyn 4646 + TomSyn2 4747 + TomSyn2 4848 + HHOpMono 4949 + Sonar1 5050 + HHOpT8-1 5151 + HHOpMono 5252 + CupL 5353 + SleighBel 5454 + HHOpT8-2 5555 + ResoXFade 5656 + CrashL 5757 + RainLoop 5858 + CupR 5959 + AirHoseL 6060 + AirHoseL 6161 + Udo Hi 6262 + MgBass2 6363 + MgBass3 6464 + PlayFxABa8 6565 + PlayFxABa8 6666 + AgogoLo 6767 + AgogoLo 6868 + HHOpHuman 6969 + VoxHitRev 7070 + HiQ1 7171 + HiQ1 7272 + LfoSeq 7373 + LfoSeq 7474 + BellAir 7575 + HH Hit 7676 + HH Hit 7777 + OohFB 7878 + OohFB 7979 + Mind Bell 8080 + Glass 8181 + Swarm 8282 + FxGun2 8383 + Lektronica 8484 + PlayFxGt12 8585 + Gunshot 8686 + Police 8787 + Ripper 8888 + PlayFxGt7 8989 + TapeRewnd 9090 + FxGun1 9191 + Bomb 9292 + Zap2 9393 + NzBurst 9494 + StabGiant 9595 + StabOrch 9696 + + + + ClaveT8 2424 + SdHpStk6L 2525 + GuiroLong 2626 + SdHpStk6R 2727 + GuiroLong 2828 + PlayFxABa9 2929 + Castanet 3030 + PlayFxABa8 3131 + Stick 3232 + PlayFxABa7 3333 + PlayFxABa4 3434 + TomT9Hi 3535 + PickNoise3 3636 + SdClRim3 3737 + Stick2 3838 + GuiroLong 3939 + Stick2 4040 + PlayFxABa4 4141 + SdAnSmRim 4242 + PlayFxABa4 4343 + ClapAnSm 4444 + PlayFxABa4 4545 + Vibraslap 4646 + PlayFxABa4 4747 + PlayFxABa4 4848 + Seashore 4949 + PlayFxABa4 5050 + SdRkStk2St 5151 + Applause 5252 + SdRkStk1L 5353 + TambrnShk 5454 + Seashore 5555 + WoodBlock 5656 + Applause 5757 + Helicopter 5858 + SdRkStk2R 5959 + PlayFxABa3 6060 + PlayFxABa3 6161 + Castanet 6262 + Castanet 6363 + WoodBlock 6464 + TmblPailaL 6565 + TmblPailaL 6666 + Stick 6767 + Stick2 6868 + Caxixi1-2 6969 + Caxixi2 7070 + DoorSqk 7171 + DoorSqk 7272 + GuiroShort 7373 + GuiroLong 7474 + Clave 7575 + WoodBlock 7676 + WoodBlock 7777 + DoorSqk 7878 + DoorSqk 7979 + WoodBlock 8080 + Clave 8181 + DoorSqk 8282 + HandClapL 8383 + ChaCha 8484 + SdRkOp2St 8585 + BdJngl3 8686 + QuintSlp 8787 + BdRoom2 8888 + BdHSonSt 8989 + SdHeavy 9090 + PlayFxABa4 9191 + SdRkStk1St 9292 + BdSlimy 9393 + SdGate1 9494 + BdFkSonSt 9595 + BdGate 9696 + + + + CowBelT8 2424 + HHCl4R 2525 + CupR 2626 + HHOpSyn 2727 + CupL 2828 + CupSt 2929 + FMMetal2 3030 + RideSt 3131 + RideSt 3232 + Cowbell2 3333 + HHCl1St 3434 + ChaCha 3535 + Cowbell2 3636 + HHClSyn 3737 + HHOpTek 3838 + HHClT8-2 3939 + HHClRX5 4040 + Cowbell2 4141 + HHOpT8-1 4242 + Cowbell2 4343 + HHClSyn 4444 + Cowbell2 4545 + HHOpSyn 4646 + Cowbell2 4747 + Cowbell2 4848 + HHOpFx 4949 + Cowbell2 5050 + CupSt 5151 + HHOpAnCR 5252 + CupSt 5353 + TambrnSw 5454 + HHOpFx 5555 + MamboBel 5656 + HHOpFx 5757 + SleighBel 5858 + RideMono 5959 + Vibraphone 6060 + Vibraphone 6161 + Tubular 6262 + Bell 6363 + BrBell 6464 + TmblPailaH 6565 + TmblPailaL 6666 + Bell 6767 + Bell 6868 + HHCl1St 6969 + HHOpAnCR 7070 + BellAir 7171 + WindChime 7272 + HHOpRkL 7373 + Lektronica 7474 + AgogoLo 7575 + Cowbel1 7676 + Cowbell2 7777 + HiLo 7878 + HiLo 7979 + TriangleMt 8080 + TriangleOp 8181 + WindChime 8282 + SleighBel 8383 + BellTree 8484 + SmBell 8585 + SmBell 8686 + BrBell 8787 + Hibasi 8888 + Harpsicord 8989 + SdLdwHMono 9090 + Vibraphone 9191 + SdBrRim 9292 + Gamelan2 9393 + UdoFinger 9494 + FingerCym 9595 + Bell 9696 + + + + TablaMut 2424 + SdBrMtSt 2525 + SdBrSwrSt 2626 + SdBrMt2St 2727 + SdBSwrAtSt 2828 + PlyFxSl19S 2929 + PlayFxABa4 3030 + PandierThm 3131 + TablaMut 3232 + PlyFxSl14H 3333 + PlayFxABa4 3434 + TabraCmb 3535 + Wataiko 3636 + QuintTip 3737 + SdBrMt2St 3838 + HandClapSt 3939 + SdFkAySt 4040 + Udo Low 4141 + TablaMut 4242 + Udo Low 4343 + TabraBya 4444 + Udo Hi 4545 + TabraNah 4646 + Udo Hi 4747 + UdoFinger 4848 + RideR 4949 + UdoFinger 5050 + CupSt 5151 + CupMono2 5252 + CupSt 5353 + TambrnHit 5454 + CupSt 5555 + Cowbel1 5656 + RideMono 5757 + Vibraslap 5858 + RideL 5959 + BongoHi1-2 6060 + BongoLo1-3 6161 + CongaTip 6262 + CongaSlp 6363 + CongaOp 6464 + TmbaleH1-3 6565 + TmbaleL1-3 6666 + AgogoHi 6767 + AgogoLo 6868 + TmbourmFng 6969 + TmbourmFng 7070 + HandClapL 7171 + HandClapL 7272 + GuiroLong 7373 + GuiroLong 7474 + UdoFinger 7575 + TabraBya 7676 + CongaTip 7777 + Udo Hi 7878 + Udo Hi 7979 + UdoFinger 8080 + FingerCym 8181 + TablaMut 8282 + SleighBel 8383 + BellTree 8484 + PlayFxABa4 8585 + PlayFxABa3 8686 + PlayFxABa3 8787 + PlayFxABa2 8888 + PlayFxABa3 8989 + PlayFxABa8 9090 + TumbaOp 9191 + PlayFxABa1 9292 + PlayFxABa7 9393 + Udo Low 9494 + DjembeCmb 9595 + TumbaSlp 9696 + + + + Scratch 2424 + Scratch 2525 + ScratchD 2626 + ScratchH 2727 + ScratchH 2828 + ScratchL 2929 + ScratchL 3030 + ScratchB 3131 + ScratchB 3232 + ScratchS 3333 + ScratchS 3434 + ScratchV 3535 + Scratch 3636 + Scratch 3737 + ScratchD 3838 + ScratchH 3939 + ScratchH 4040 + ScratchL 4141 + ScratchL 4242 + ScratchB 4343 + ScratchB 4444 + ScratchS 4545 + ScratchS 4646 + ScratchV 4747 + ScratchV 4848 + ScratchS 4949 + ScratchS 5050 + ScrathcH 5151 + ScratchH 5252 + ScratchC 5353 + ScratchC 5454 + ScratchC 5555 + ScratchC 5656 + Scratch 5757 + Scratch 5858 + ScratchD 5959 + ScratchH 6060 + ScratchH 6161 + ScratchL 6262 + ScratchL 6363 + ScratchB 6464 + ScratchB 6565 + ScratchS 6666 + ScratchS 6767 + ScratchV 6868 + ScratchV 6969 + ScratchS 7070 + ScratchS 7171 + ScrathcH 7272 + ScratchH 7373 + ScratchC 7474 + ScratchC 7575 + ScratchC 7676 + ScratchC 7777 + Scratch 7878 + Scratch 7979 + ScratchD 8080 + ScratchH 8181 + ScratchH 8282 + ScratchL 8383 + ScratchL 8484 + ScratchB 8585 + ScratchB 8686 + ScratchS 8787 + ScratchS 8888 + ScratchV 8989 + ScratchV 9090 + ScratchS 9191 + ScratchS 9292 + ScrathcH 9393 + ScratchH 9494 + ScratchC 9595 + ScratchC 9696 + + + + SdNm1St 2424 + SdNm2St 2525 + SdNm3St 2626 + SdNm4St 2727 + SdFk1St 2828 + SdFk2St 2929 + SdFk3St 3030 + SdFkAySt 3131 + SdBs1St 3232 + SdBs2St 3333 + SdBs3St 3434 + SdSon1St 3535 + SdSon2St 3636 + SdSon3St 3737 + SdSon4St 3838 + SdBl1St 3939 + SdBl2St 4040 + SdBl3St 4141 + SdBh1St 4242 + SdBh2St 4343 + SdBh3St 4444 + SdLdw1St 4545 + SdLdw2St 4646 + SdLdw3St 4747 + SdLdw4St 4848 + SdHip1St 4949 + SdHip2St 5050 + SdRkOp1St 5151 + SdRkMte1St 5252 + SdRkRim1St 5353 + SdRkOp2St 5454 + SdRkMte2St 5555 + SdRkRim2St 5656 + SdRkFlmSt 5757 + SdRkOp1St 5858 + SdRkMte1St 5959 + SdRkRim1St 6060 + SdRkOp2St 6161 + SdRkMte2St 6262 + SdRkRim2St 6363 + SdRkFlmSt 6464 + SdNm3St 6565 + SdFkAySt 6666 + SdBs3St 6767 + SdSon3St 6868 + SdBh3St 6969 + SdLdw3St 7070 + SdLdw3R 7171 + SdPicol 7272 + SdPcRim 7373 + SdPcRim2 7474 + SdMid 7575 + SdMdRim 7676 + SdAmb 7777 + SdGate1 7878 + SdLdwHMono 7979 + SdBrRim 8080 + SdDry 8181 + SdHeavy 8282 + SdGM 8383 + SdRkStk1St 8484 + SdRkStk2St 8585 + SdClRmSt 8686 + SdClRim2 8787 + SdClRim3 8888 + SdRkRolSt 8989 + SdRkOp2St 9090 + SnLvRolSt 9191 + SdSon2St 9292 + SdRollMono 9393 + SdLdw3St 9494 + SdBrMtSt 9595 + SdBSwrAtSt 9696 + + + + SdNmSt1-4 2424 + SdNmSt1-3 2525 + SdNmSt2-4 2626 + SdNmSt1-2 2727 + SdNmSt2-3 2828 + SdNmSt3-4 2929 + SdNm1St 3030 + SdNm2St 3131 + SdNm3St 3232 + SdNm4St 3333 + SdFkSt1-3 3434 + SdFkSt1-2 3535 + SdFkSt2-3 3636 + SdFkSt1/3 3737 + SdFk1St 3838 + SdFk2St 3939 + SdFk3St 4040 + SdFkAySt 4141 + SdBsSt1-3 4242 + SdBsSt1-2 4343 + SdBsSt2-3 4444 + SdBsSt1/3 4545 + SdBs1St 4646 + SdBs2St 4747 + SdBs3St 4848 + SdSonSt1-4 4949 + SdSonSt1-3 5050 + SdSonSt2-4 5151 + SdSonSt1-2 5252 + SdSonSt2-3 5353 + SdSonSt3-4 5454 + SdSon1St 5555 + SdSon2St 5656 + SdSon3St 5757 + SdSon4St 5858 + SdBlSt1-3 5959 + SdBlSt1-2 6060 + SdBlSt2-3 6161 + SdBlSt1/3 6262 + SdBl1St 6363 + SdBl2St 6464 + SdBl3St 6565 + SdBhSt1-3 6666 + SdBhSt1-2 6767 + SdBhSt2-3 6868 + SdBhSt1/3 6969 + SdBh1St 7070 + SdBh2St 7171 + SdBh3St 7272 + SdLdwSt1-4 7373 + SdLdwSt1-3 7474 + SdLdwSt2-4 7575 + SdLdwSt1-2 7676 + SdLdwSt2-3 7777 + SdLdwSt3-4 7878 + SdLdw1St 7979 + SdLdw2St 8080 + SdLdw3St 8181 + SdLdw4St 8282 + SdHip1St 8383 + SdRkOp1St 8484 + SdRkMte1St 8585 + SdRkRim1St 8686 + SdRkOp2St 8787 + SdRkMte2St 8888 + SdRkRim2St 8989 + SdRkFlmSt 9090 + SdRkRolSt 9191 + SdRkOp1St 9292 + SdRkRolDSt 9393 + SdRkOp2St 9494 + SnLvRolSt 9595 + SdNm3St 9696 + + + + BdNmSt1-2 2424 + BdNm1St 2525 + BdNm2St 2626 + BdNmL1-2 2727 + BdFkSt1-2 2828 + BdFk1St 2929 + BdFk2St 3030 + BdHiSt 3131 + BdLoSt 3232 + BdHSonSt 3333 + BdLSonSt 3434 + BdFkSonSt 3535 + BdRk1St 3636 + BdRk2St 3737 + BdDry1 3838 + BdDry2 3939 + BdPop 4040 + BdVar1 4141 + BdVar2 4242 + BdRoom1 4343 + BdRoom2 4444 + BdRoom3 4545 + BdGate 4646 + BdFXGate 4747 + BdT9-1 4848 + BdT9-2 4949 + BdT9-3 5050 + BdT9-4 5151 + BdT9Hd1 5252 + BdT9Hd2 5353 + BdT9Hd3 5454 + BdT8-1 5555 + BdT8-2 5656 + BdT8-3 5757 + BdAnSm 5858 + BdAnCR 5959 + BdHuman1 6060 + BdHuman2 6161 + BdBlip 6262 + BdBlpHd 6363 + BdJngl1 6464 + BdJngl2 6565 + BdJngl3 6666 + BdD&B1 6767 + BdD&B2 6868 + BdR&B1 6969 + BdR&B2 7070 + BdHipDp 7171 + BdBrkDp 7272 + BdBreak1 7373 + BdBreak2 7474 + BdBreakHvy 7575 + BdBreakHrd 7676 + BdDist1 7777 + BdDist2 7878 + BdDist3 7979 + BdDist4 8080 + BdDist5 8181 + BdDistRM 8282 + Bd+HH 8383 + BdFxHmr 8484 + BdZapHrd 8585 + BdZapMid 8686 + BdSus 8787 + BdTekPower 8888 + BdHardLong 8989 + BdATite 9090 + BdAnHard 9191 + BdLofi 9292 + BdThkSkn 9393 + BdSlimy 9494 + BdSlimy 9595 + BdSlimy 9696 + + + + BdT9-1 2424 + BdT9-1 2525 + BdT9-2 2626 + BdT9-3 2727 + BdT9-3 2828 + BdT9-4 2929 + BdT9Hd1 3030 + BdT9Hd2 3131 + BdT9Hd3 3232 + BdT9Hd3 3333 + BdHardLong 3434 + BdAnCR 3535 + BdT9-1 3636 + BdT9-2 3737 + BdT9-3 3838 + BdT9-4 3939 + BdT9Hd1 4040 + BdT9Hd2 4141 + BdT9Hd3 4242 + BdT8-1 4343 + BdT8-2 4444 + BdT8-3 4545 + BdAnSm 4646 + BdAnCR 4747 + BdHuman1 4848 + BdHuman2 4949 + BdBlip 5050 + BdBlpHd 5151 + BdJngl1 5252 + BdJngl2 5353 + BdJngl3 5454 + BdD&B1 5555 + BdD&B2 5656 + BdR&B1 5757 + BdR&B2 5858 + BdHipDp 5959 + BdBrkDp 6060 + BdBreak1 6161 + BdBreak2 6262 + BdBreakHvy 6363 + BdBreakHrd 6464 + BdDist1 6565 + BdDist2 6666 + BdDist3 6767 + BdDist4 6868 + BdDist5 6969 + BdDistRM 7070 + Bd+HH 7171 + BdFxHmr 7272 + BdZapHrd 7373 + BdZapMid 7474 + BdSus 7575 + BdTekPower 7676 + BdHardLong 7777 + BdATite 7878 + BdAnHard 7979 + BdLofi 8080 + BdThkSkn 8181 + BdSlimy 8282 + BdGate 8383 + BdFXGate 8484 + BdT9-1 8585 + BdT9-2 8686 + BdT9-3 8787 + BdT9-4 8888 + BdT9Hd1 8989 + BdT9Hd2 9090 + BdT9Hd3 9191 + BdBlpHd 9292 + BdR&B2 9393 + BdZapMid 9494 + BdHardLong 9595 + BdATite 9696 + + + + SdFx1 2424 + SdFx2 2525 + SdFx3 2626 + SdFx4 2727 + SdDist 2828 + SdCut 2929 + SdDodgH 3030 + SdDodgL 3131 + SdFM 3232 + SdSyn 3333 + SdHammer 3434 + SdLofi 3535 + SdT9-1 3636 + SdT9-2 3737 + SdT9-3 3838 + SdT9-4 3939 + SdT9-5 4040 + SdT9Gate 4141 + SdT8-1 4242 + SdT8-2 4343 + SdT8-3 4444 + SdT8-4 4545 + SdT8-5 4646 + SdAnSm 4747 + SdAnCR 4848 + SdHuman1 4949 + SdJngl1 5050 + SdJngl2 5151 + SdJngl3 5252 + SdJnglFx 5353 + SdD&B1 5454 + SdD&B2 5555 + SdD&B3 5656 + SdD&B4 5757 + SdR&B1 5858 + SdR&B1Rm 5959 + SdR&B2 6060 + SdHip1 6161 + SdHip2 6262 + SdHip3 6363 + SdHipGate 6464 + SdHipRm1 6565 + SdHipRm2 6666 + SdHipRm3 6767 + SdHipRm4 6868 + SdHipRm5 6969 + SdBreak2 7070 + SdBreakHvy 7171 + PlayFxGt1 7272 + PlayFxGt5 7373 + PlayFxGt12 7474 + PlayFxABa1 7575 + PlayFxABa8 7676 + PickNoise3 7777 + Scratch H 7878 + Scratch L 7979 + ScratchDwn 8080 + ScratchHiF 8181 + ScratchStp 8282 + ScratchSpn 8383 + Ripper 8484 + NzBurst 8585 + Zap1 8686 + Zap2 8787 + HiQ1 8888 + HiQ2 8989 + Bomb 9090 + FxGun1 9191 + Electer 9292 + HH Hit 9393 + Mother 9494 + HitOrch2 9595 + StabGiant 9696 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Switch General Midi mode on + 0x7e 0x7f 0x09 0x01 + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Switch GS mode on + 0x41 0x10 0x42 0x12 0x40 0x00 0x7f 0x00 0x41 + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Switch XG mode on + 0x43 0x10 0x4c 0x00 0x00 0x7e 0x00 + + + + + 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 Binary files /dev/null and b/muse/share/locale/muse_de.qm 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 @@ + + + + + Click this button to enable recording + dieser Button schaltet in den Aufnahmemode + + + + @default + + Click this button to open a <em>new song</em>.<br>You can also select the <b>Open command</b> from the File menu. + + + + 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. + + + + Create New Song + Erzeuge neuen Song + + + Click this button to stop playback + + + + Click this button to start playback + + + + Click this button to rewind to start position + + + + Click this button to rewind + + + + Click this button to forward current play position + + + + loop between left mark and right mark + + + + record starts at left mark + + + + record stops at right mark + + + + rewind to start position + + + + rewind current position + + + + move current position + + + + stop sequencer + + + + start sequencer play + + + + to record press record and then play + + + + send note off to all midi channels + + + + pointer + Zeiger + + + presets (*.pre *.pre.gz *.pre.bz2) + + + + All Files (*) + + + + Add Midi Track + + + + Add Wave Track + + + + Add Audio Output + + + + Add Audio Group + + + + Add Audio Input + + + + Add Aux Send + + + + Click this button to enable recording + dieser Button schaltet in den Aufnahmemode + + + Midi Strips + + + + Add Midi Output Port + + + + Add Midi Input Port + + + + Audio Strips + + + + + AboutBox + + AboutBox + + + + Keep On Rocking! + + + + 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 + + + + + Appearance + + MusE: load image + + + + + AppearanceDialogBase + + MusE: Appearance settings + + + + Apply + + + + Ok + + + + Cancel + + + + Arranger + + + + Parts + + + + show names + + + + show events + + + + show Cakewalk Style + + + + Events + + + + note on + + + + poly pressure + + + + controller + + + + aftertouch + + + + pitch bend + + + + program change + + + + special + + + + Background picture + + + + bg + + + + select... + + + + show snap grid + + + + Colors + + + + Items + + + + Style/Fonts + + + + QT Theme + + + + Windows + + + + MusE + + + + Metal + + + + Norwegian Wood + + + + Platinum + + + + CDE + + + + Motif + + + + Motif Plus + + + + Fonts + + + + Family + + + + Size + + + + Font 1 + + + + Font 2 + + + + Font 3 + + + + Font 0 + + + + Bold + + + + Italic + + + + ... + + + + Font 4 + + + + Font 5 + + + + Palette + + + + add to palette + + + + B + + + + S + + + + H + + + + V + + + + G + + + + R + + + + Itemdsfkajlk jölk ljfölajföajföajf + + + + + Arranger + + NO + Nein + + + TrackInfo + SpurInfo + + + Track + Spur + + + + ClipListEditorBase + + MusE: ClipList + + + + Name + + + + Refs + + + + Start + + + + Len + + + + Data + + + + Clip Properties + + + + Pos: + + + + Len: + + + + + CommentBase + + Form1 + + + + Track Comment + + + + Track 1 + + + + + ConfigMidiCtrlBase + + MusE: Config Midi Controller + + + + Midi Port: + + + + Available Controller: + + + + Add + + + + Remove + + + + Automated Controller: + + + + &OK + + + + &Cancel + + + + + ConfigMidiFileBase + + MusE: Config Midi File Export + + + + &OK + + + + &Cancel + + + + 0 (single track) + + + + 1 (multiple tracks) + + + + Format: + + + + 96 + + + + 192 + + + + 384 + + + + Division: + + + + Copyright: + + + + Enable extended smf format + + + + + ConfigTrackListBase + + MusE: Config Track List + + + + Track Type: + + + + Audio Output + + + + Audio Group + + + + Audio Aux + + + + Wave Track + + + + Audio Input + + + + Soft Synthesizer + + + + Midi Track + + + + Drum Track + + + + Available Items: + + + + Add + + + + Remove + + + + Up + + + + Down + + + + Configured Items + + + + Track Name Size: + + + + &OK + + + + &Cancel + + + + + DeicsOnzeGuiBase + + DeicsOnze + + + + &Presets + + + + LBA + + + + Subcategory + + + + PRO + + + + Preset + + + + Bank numerous + + + + NONE + + + + Program numerous + + + + INITVOICE + + + + DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence + + + + HBA + + + + Category + + + + &Global + + + + Op4 Feedback + + + + Feedback level of the operator 4 + + + + Master Volume + + + + Master volume + + + + Modulation Matrix + + + + <b>Algorithm 1</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 2</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by both <i>Op 3</i> and <i>Op 4</i><br> +<b>Algorithm 3</b> : <i>Op 1</i> modulated by both <i>Op 4</i> and <i>Op 2</i> modulated by <i>Op 3</i><br> +<b>Algorithm 4</b> : <i>Op 1</i> modulated by both <i>Op 2</i> and <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 5</b> : (<i>Op 1</i> modulated by <i>Op 2</i>) add to (<i>Op 3</i> modulated by <i>Op 4</i>) <br> +<b>Algorithm 6</b> : addition of the three <i>Op 1, 2, 3</i> all modulated by <i>Op 4</i><br> +<b>Algorithm 7</b> : addition of the three <i>Op 1, 2, 3</i> with <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 8</b> : addition of the four <i>Op 1, 2, 3, 4</i> + + + + LFO + + + + LFO Sync + + + + Pitch modulation sensitivity + + + + Pitch Modulation Sensitivity + + + + LFO Delay + + + + LFO delay + + + + LFO speed + + + + Amplitude modulation depth + + + + Pitch modulation depth + + + + Amplitude modulation sensitivity + + + + Amplitude Modulation Sensitivity + + + + AMS + + + + LFO Waveform + + + + Pitch Modulation Depth + + + + PMD + + + + LFO Speed + + + + AMD + + + + Speed + + + + Delay + + + + PMS + + + + Pitch Envelope + + + + PL3 + + + + PL2 + + + + PL1 + + + + PR1 + + + + PR2 + + + + PR3 + + + + Op &1 + + + + OUT 1 + + + + Output Volume + + + + Volume + + + + Frequency 1 + + + + Coarse 1 + + + + Coarse Ratio + + + + Fine 1 + + + + Fine Ratio + + + + Freq 1 + + + + Fixed Frequency + + + + FIX + + + + Toggle Fix Frequency + + + + Sensitivity 1 + + + + KVS1 + + + + AME1 + + + + Amplitude Modulation Enable + + + + Keyboard Velocity Sensitivity + + + + Key Velocity Sensitivity + + + + EBS1 + + + + EG Bias Sensitivity + + + + Eg Bias Sensitivity + + + + Detune, OSCWave, EGShift 1 + + + + DET1 + + + + Detune + + + + Attack Rate of the operator 1 + + + + 96dB + + + + 48dB + + + + 24dB + + + + 12dB + + + + EG Shift + + + + Wave form + + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + Amplitude Envelope 1 + + + + RR1 + + + + D1R1 + + + + D1L1 + + + + D2R1 + + + + Release Rate + + + + 2° Decay Rate + + + + 1° Decay Level + + + + 1° Decay Rate + + + + Attack Rate + + + + AR1 + + + + Scaling 1 + + + + LS1 + + + + RS1 + + + + Rate Scaling + + + + Level Scaling + + + + Op &2 + + + + Sensitivity 2 + + + + EBS2 + + + + KVS2 + + + + AME2 + + + + Detune, OSCWave, EGShift 2 + + + + DET2 + + + + OUT 2 + + + + Scaling 2 + + + + LS2 + + + + RS2 + + + + Frequency 2 + + + + Coarse 2 + + + + Fine 2 + + + + Freq 2 + + + + Amplitude Envelope 2 + + + + D1R2 + + + + D1L2 + + + + D2R2 + + + + RR2 + + + + AR2 + + + + Op &3 + + + + Sensitivity 3 + + + + EBS3 + + + + KVS3 + + + + AME3 + + + + Detune, OSCWave, EGShift 3 + + + + DET3 + + + + Frequency 3 + + + + Coarse 3 + + + + Fine 3 + + + + Freq 3 + + + + OUT 3 + + + + Scaling 3 + + + + LS3 + + + + RS3 + + + + Amplitude Envelope 3 + + + + D1R3 + + + + D1L3 + + + + D2R3 + + + + RR3 + + + + AR3 + + + + Op &4 + + + + Sensitivity 4 + + + + EBS4 + + + + KVS4 + + + + AME4 + + + + Detune, OSCWave, EGShift 4 + + + + DET4 + + + + OUT 4 + + + + Scaling 4 + + + + LS4 + + + + RS4 + + + + Frequency 4 + + + + Coarse 4 + + + + Fine 4 + + + + Freq 4 + + + + amplitude Envelope 4 + + + + AR4 + + + + D1R4 + + + + D1L4 + + + + D2R4 + + + + RR4 + + + + &Fun + + + + Phony Mode + + + + POLY + + + + MONO + + + + Reverb + + + + Foot Control + + + + Pitch Bend Range + + + + Amplitude + + + + Pitch + + + + Modulation Wheel + + + + Breath Control + + + + Envelope Bias + + + + Pitch Bias + + + + After Touch + + + + Potamento + + + + FINGER + + + + FULL + + + + Portamento Mode + + + + PT + + + + Portamento Time + + + + Foot Switch + + + + Sustain + + + + Portamento + + + + Transpose + + + + &Config + + + + Configuration File + + + + Save + Sichern + + + Load + + + + Quality + + + + High + + + + Middle + + + + Low + + + + NbrV + + + + Number of Voices + + + + Colors + + + + Red + + + + Green + + + + Blue + + + + Text + + + + Background + + + + Edit Text + + + + Edit Background + + + + Save Mode + + + + Save only the used presets into the project + + + + Save the entire set into the project + + + + Save the configuration into the project + + + + + DrumEdit + + Port + Port + + + + EditCtrl7DialogBase + + MusE: Enter Controller + + + + Controller: + + + + Time Position: + + + + Value: + + + + controller value + + + + OK + + + + Cancel + + + + + EditCtrlBase + + MusE: Edit Controller Event + + + + Available Controller: + + + + Create New Controller + + + + Value + + + + Controller + + + + H-Bank + + + + L-Bank + + + + Program + + + + off + + + + &OK + + + + &Cancel + + + + Midi Port: + + + + Midi Channel: + + + + Time Position: + + + + Patch Name + + + + + EditInstrumentBase + + MusE: Instrument Editor + + + + Patches + + + + Patch Name: + + + + High Bank: + + + + Low Bank: + + + + Program: + + + + d.c. + dont care + + + + d.c. + + + + Patch/Group + + + + &Delete + + + + Alt+D + + + + &New Patch + + + + Alt+N + + + + New Group + + + + Drum + + + + GM + + + + GS + + + + XG + + + + Controller + + + + Predefined Controller: + + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Properties + + + + Name + + + + Type + + + + Control7 + + + + Control14 + + + + RPN + + + + NRPN + + + + Pitch + + + + Program + + + + H-Ctrl + + + + Midi Controller Number High Byte + + + + L-Ctrl + + + + Midi Controller Number Low Byte + + + + Range + + + + Min + + + + Max + + + + Default + + + + Name + + + + Type + + + + Min Val + + + + Max Val + + + + list of defined controllers + Liste der definierten Controller + + + This is the MusE list of defined controllers. + + + + SysEx + + + + Initialization + + + + Panic + + + + Hex Entry: + + + + &File + Datei + + + Tools + Werkzeuge + + + New + Neu + + + &New + Neu + + + Ctrl+N + + + + Open + �fnen + + + &Open... + �fnen... + + + Ctrl+O + + + + Save + Sichern + + + &Save + &Sichern + + + Ctrl+S + + + + Save As + Sichern als + + + Save &As... + + + + Exit + Beenden + + + E&xit + Beenden + + + + EditMetaDialogBase + + MusE: Enter Meta Event + + + + OK + + + + Cancel + + + + TextLabel1 + + + + Time Position: + + + + Meta Type: + + + + Enter Hex + + + + + EditNoteDialogBase + + MusE: Enter Note + + + + OK + + + + Cancel + + + + Length: + + + + Time Position: + + + + Pitch: + + + + Velocity On: + + + + Velocity Off: + + + + + EditSysexDialogBase + + MusE: Enter SysEx + + + + TimePosition: + + + + Comment: + + + + OK + + + + Cancel + + + + Known SysEx: + + + + Add + + + + + FLUIDGuiBase + + Form1 + + + + Soundfont + + + + Load + + + + + FLUIDSynthGuiBase + + FLUID Synth + + + + Load + + + + Delete + + + + Dump Info + + + + ID + + + + Fontname + + + + Chnl + + + + Soundfont + + + + Drum Chnl + + + + Level + + + + Width + + + + Damping + + + + Room Size + + + + Reverb + + + + CHANNEL SETUP + + + + Sine + + + + Triangle + + + + Type + + + + Number + + + + Speed + + + + Depth + + + + Chorus + + + + Gain + + + + LOADED SOUNDFONTS + + + + + FileDialogButtons + + Form1 + + + + Global + + + + User + + + + Project + + + + Load: + + + + Songdata + +Cofiguration + + + + only +Songdata + + + + + GateTimeBase + + MusE: Modify Gate Time + + + + Range + + + + All Events + + + + Selected Events + + + + Looped Events + + + + Selected & Looped + + + + Values + + + + Rate: + + + + Offset: + + + + % + + + + OK + + + + Cancel + + + + + GlobalSettingsDialogBase + + MusE: Global Settings + + + + Audio + + + + Mixer + + + + dB + + + + min. Meter Value + + + + min.Slider Val + + + + Midi + + + + Ticks + + + + 1024 + + + + 2048 + + + + 4096 + + + + 8172 + + + + Displayed Resolution +(Ticks/Quarternote) + + + + 48 + + + + 96 + + + + 192 + + + + 384 + + + + 768 + + + + 1536 + + + + 3072 + + + + 6144 + + + + 12288 + + + + RTC Resolution +(Ticks/Sec) + + + + GUI + + + + /sec + + + + GUI Refresh Rate + + + + &Apply + + + + &Ok + + + + &Cancel + + + + Help Browser: + Hilfe Browser: + + + Application + + + + Start Muse + + + + start with last song + + + + start with song + + + + start song: + + + + Views + + + + y-pos + + + + show + + + + x-pos + + + + height + + + + width + + + + Big Time + + + + Arranger + + + + Transport + + + + Cur + + + + set current values + + + + start with template: default.med + + + + show splash screen + + + + use JACK freewheel mode if possible + + + + Mixer 1 + + + + Mixer 2 + + + + + MITTransposeBase + + MusE: Midi Input Plugin: Transpose + + + + On + + + + TriggerKey + + + + Transpose: + + + + +0 + + + + + MPConfig + + Port + Port + + + + MRConfigBase + + MusE: Midi Input Plugin: Remote Control + + + + Activate + + + + On + + + + Actions + + + + Stop + Halt + + + Record + Aufnahme + + + Goto Left Mark + + + + Play + Wiedergabe + + + + MidiController + + Velocity + + + + + MidiControllerEditDialogBase + + Type + Typ + + + Properties + Eigenschaften + + + Type + Typ + + + &New + Neu + + + &Delete + Löschen + + + &OK + OK + + + &Cancel + Abbrechen + + + MusE: Define Midi Controller + + + + &Add + + + + Alt+A + + + + create new entry + + + + pressing the New button you create a new entry +in the MusE list of defined controllers + + + + delete selected entry + + + + Predefined Controller: + + + + Name + + + + H-Ctrl + + + + L-Ctrl + + + + Min Val + + + + Max Val + + + + list of defined controllers + Liste der definierten Controller + + + This is the MusE list of defined controllers. + + + + Managed Controller for Port + + + + Channel + + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Name + + + + Min Value + + + + Max Value + + + + Control7 + + + + Control14 + + + + RPN + + + + NRPN + + + + Pitch + + + + Program + + + + Midi Controller Number High Byte + + + + Midi Controller Number Low Byte + + + + Range + + + + + MidiInputTransformDialogBase + + Port + Port + + + &New + Neu + + + + MidiPortRouteBase + + MusE: Midi Port Routing + + + + Port 2 + + + + Output + + + + Input + + + + + MidiSyncConfigBase + + MusE: Midi Sync + + + + Sync Mode + + + + Master + + + + Slave + + + + Sync Source + + + + accept MTC + + + + accept Midi Clock + + + + accept MMC + + + + Id: + + + + device id + + + + Sync Gen + + + + Midi Time Code (MTC) + + + + Midi Clock + + + + Midi Machine Control (MMC) + + + + Apply + + + + Ok + + + + Cancel + + + + MTC + + + + Type: + + + + 24 + + + + 25 + + + + 30D + + + + 30N + + + + Offset: + + + + hour + + + + h + + + + minute + + + + m + + + + second + + + + s + + + + frame + + + + f + + + + subframe + + + + + MidiTrackInfoBase + + Track Info + Spur Info + + + Track Name + Spur Name + + + MusE: TrackInfo + + + + Output Channel + + + + all midi events are send to this output channel + + + + % + + + + Modify Note Length + + + + Output Port + Ausg.Port + + + OCh. + + + + off + + + + Track Delay (ticks) + + + + Compress Note Velocity + + + + Pitch Transpose + + + + Transp. + + + + Delay + + + + Compr. + + + + Velocity + + + + Modify Note Velocity + + + + Length + + + + Input Ports + + + + IChan. + + + + Input Channels + + + + 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 + + + + Channel Info + + + + ??? + + + + Select Instrument Patch + + + + Bank Select LSB + + + + Bank Select MSB + + + + H-Bank + + + + Instrument High Bank + + + + L-Bank + + + + Instrument Low Bank + + + + Progr. + + + + Instrument/Program/Patch + + + + + MidiTransformDialogBase + + &New + Neu + + + MusE: Midi Transformator + + + + &Delete + + + + &Apply + + + + &OK + + + + &Cancel + + + + PresetList + + + + Processing + + + + Event Type + + + + Keep + + + + Fix + + + + Note + + + + Poly Pressure + + + + Control Change + + + + Aftertouch + + + + Pitch Bend + + + + NRPN + + + + RPN + + + + Plus + + + + Minus + + + + Multiply + + + + Divide + + + + Value 2 + + + + Invert + + + + ScaleMap + + + + Flip + + + + Dyn + + + + Random + + + + Value 1 + + + + Length + + + + Position + + + + Filter + + + + All + + + + Equal + + + + Unequal + + + + Sysex + + + + Meta + + + + Ignore + + + + Higher + + + + Lower + + + + Inside + + + + Outside + + + + Bar Range + + + + Preset + + + + Name: + + + + Comment: + + + + Range + + + + process all events + + + + selected tracks + + + + inside loop + + + + Function + + + + Select + + + + Quantize + + + + Delete + + + + Transform + + + + Insert + + + + Copy + Kopieren + + + Extract + + + + Quantize Value + + + + + MidiTransformerDialog + + New + Neu + + + + MixdownFileDialogBase + + MusE: Set Mixdown Wavefile + + + + &OK + + + + &Cancel + + + + File Path + + + + Channel + + + + Stereo + + + + Mono + + + + 5.1 + + + + wav,16 Bit + + + + wav, 24 Bit + + + + wav, 32 Bit (float) + + + + Format + + + + + Mixer + + Port + Port + + + + MusE + + &File + Datei + + + Open &Recent + + + + Save &As + Sichern als + + + Config &Printer + Druckerkonfiguration + + + Import Midifile + Mididatei Importieren + + + Export Midifile + Mididatei Exportieren + + + Import Wave File + Wavedatei Importieren + + + &Quit + Beenden + + + &Edit + Editieren + + + C&ut + Ausschneiden + + + &Copy + Kopieren + + + &Paste + Einfgen + + + Delete Track + Spur Lschen + + + Add Track + Spur hinzufgen + + + Select &All + Alles Ausw�len + + + &Deselect All + + + + Invert &Selection + + + + &Inside Loop + + + + &Outside Loop + + + + All &Parts on Track + + + + Select + + + + Drums + + + + List + + + + Graphic + + + + Mastertrack + + + + Midi &Transform + + + + Modify Gate Time + + + + Modify Velocity + + + + Crescendo + + + + Transpose + + + + Thin Out + + + + Erase Event + + + + Note Shift + + + + Move Clock + + + + Copy Measure + + + + Erase Measure + + + + Delete Measure + + + + Create Measure + + + + Mix Track + + + + Midi + + + + &Structure + + + + Global Cut + + + + Global Insert + + + + Global Split + + + + Copy Range + + + + Cut Events + + + + Transport Panel + + + + Bigtime window + + + + dont follow Song + + + + follow page + + + + follow continuous + + + + Global Settings + + + + follow song + + + + Midi Sync + + + + Appearance settings + + + + Midi Remote Control + + + + &Midi + + + + Input Plugins + + + + Reset Instr. + + + + Init Instr. + + + + local off + + + + &Audio + + + + Bounce to Track + + + + Bounce to File + + + + &Help + &Hilfe + + + Browser + Browser + + + About&Qt + + + + MusE: load project + + + + The current Project contains unsaved data +Save Current Project? + + + + &Save + &Sichern + + + &Nosave + &NichtSichern + + + &Abort + + + + MusE: Save As + MusE: Sichern als + + + Nothing to edit + + + + The current Project contains unsaved data +Load overwrites current Project: +Save Current Project? + + + + &Overwrite + + + + no help found at: + + + + MusE: Open Help + + + + UndoRedo + + + + undo + + + + Und&o + + + + redo + + + + Re&do + + + + undo last change to song + + + + redo last undo + + + + Transport + + + + loop + + + + Loop + Schleife + + + punchin + + + + Punchin + Einfgen + + + punchout + + + + Punchout + Punchout + + + start + + + + Start + + + + rewind + + + + Rewind + Zurck + + + forward + + + + Forward + Vorw�ts + + + stop + + + + Stop + Halt + + + play + + + + Play + Wiedergabe + + + record + + + + Record + Aufnahme + + + panic + + + + Panic + + + + new + + + + &New + Neu + + + open + + + + &Open + + + + save + + + + pianoroll + + + + Pianoroll + + + + Marker + + + + File Buttons + + + + Unknown File Format + + + + MusE: Write File failed + + + + MusE: Song: + + + + MusE: Copy Range + + + + not implemented + + + + MusE: Cut Events + + + + MusE: Bounce to Track + + + + more than one target track selected + + + + wrong target track type, +select wave track as target + + + + no target track selected + + + + Delete Selected Tracks + + + + Edit Instrument + + + + Configure shortcuts + + + + Midi File Export + + + + &Manual + + + + &MusE homepage + + + + &Report Bug... + + + + &About MusE + + + + What's &This? + + + + Cannot read template + + + + File open error + + + + File read error + + + + MusE: load template + + + + MusE: Bounce + + + + set left/right marker for bounce range + + + + MusE: Bounce to File + + + + no output track found + + + + MusE: Export Midi + + + + MusE: Import Midi + + + + Add midi file to current project? + + + + + &Add to Project + + + + &Replace + + + + reading midifile + + + + + +failed: + + + + Arranger + + + + Cursor + + + + Off + + + + Bar + + + + Snap + + + + Len + + + + Pitch + + + + midi pitch + + + + global midi pitch shift + + + + Tempo + + + + midi tempo + + + + N + + + + MusE: Create tmp file failed + + + + &View + + + + Mixer 1 + + + + Mixer 2 + + + + Setti&ngs + + + + + OrganGuiBase + + MusE: Organ + + + + Drawbars + + + + 16' + + + + 4' + + + + 2 2/3' + + + + 2' + + + + 5 1/3' + + + + 8' + + + + Envelope Hi + + + + Release + + + + Sustain + + + + Decay + + + + Attack + + + + ms + + + + cB + + + + Envelope Lo + + + + O-1 + + + + Oscillator + + + + Brass + + + + Reed + + + + Flute + + + + Velocity + + + + + PageSettings + + Track Name + Spur Name + + + + PartCanvas + + delete + Entfernen + + + + PatchBayBase + + ALSA Patch Bay + + + + + PluginDialog + + Ok + + + + Cancel + + + + MusE: select plugin + + + + Lib + + + + Label + + + + Name + + + + AI + + + + AO + + + + CI + + + + CO + + + + IP + + + + id + + + + Maker + + + + Copyright + + + + Stereo and Mono + + + + Stereo + + + + Mono + + + + All + + + + 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. + + + + + PluginGui + + bypass plugin + + + + MusE: load preset + + + + MusE: save preset + + + + File Buttons + + + + Load Preset + + + + Save Preset + + + + + QHeader + + Track Name + Spur Name + + + Output Port + Ausg.Port + + + + QPopupMenu + + Add Midi Generator... + + + + Add Soft Synth... + + + + + QWidget + + new + + + + File + + + + + +exists + + + + MusE: write + + + + Overwrite + + + + Quit + + + + None + + + + + RhythmBase + + Group + Gruppe + + + &New + Neu + + + list of defined controllers + Liste der definierten Controller + + + &File + Datei + + + &Edit + Editieren + + + &Help + &Hilfe + + + Tools + Werkzeuge + + + New + Neu + + + Open + �fnen + + + &Open... + �fnen... + + + Save + Sichern + + + &Save + &Sichern + + + Save As + Sichern als + + + Print + Drucken + + + &Print... + Drucken + + + Exit + Beenden + + + E&xit + Beenden + + + Undo + Rckg�gig + + + &Undo + Rckg�gig + + + Redo + Wiederherstellen + + + &Redo + Wiederherstellen + + + Cut + Ausschneiden + + + &Cut + Ausschneiden + + + Copy + Kopieren + + + C&opy + Kopieren + + + Paste + Einfgen + + + &Paste + Einfgen + + + Find + Suchen + + + &Find... + Suchen + + + Contents + Inhalt + + + &Contents... + Inhalt + + + Index + Index + + + &Index... + Index + + + + RhythmGenerator + + Instrument Settings: + Instrument Einstellungen + + + add + Zufgen + + + delete + Entfernen + + + Group + Gruppe + + + + RouteDialogBase + + MusE: Routing + + + + Add Route + + + + Source: + + + + Destination: + + + + Connect + + + + connect source to destination + + + + Current Routes + + + + Source + + + + Destination + + + + Remove + + + + remove selected route + + + + + SS_PluginChooserBase + + SimpleDrums - Ladspa Plugin Chooser + + + + Name + + + + Label + + + + Inports + + + + Outports + + + + Creator + + + + &Cancel + + + + Alt+C + + + + &OK + + + + Alt+O + + + + + ShortcutCaptureDialogBase + + Enter shortcut sequence + + + + Press keys to enter shortcut sequence! + + + + Old shortcut: + + + + Undefined + + + + New shortcut: + + + + OK + + + + Cancel + + + + + ShortcutConfig + + Global + + + + Arranger + + + + Pianoroll + + + + Drumeditor + + + + List editor + + + + List Mastertrack + + + + All categories + + + + Transport: Start playback from current location + + + + Transport: Toggle metronome + + + + Transport: Stop Playback + + + + Transport: Play, Stop, Rewind + + + + Transport: Goto left marker + + + + Transport: Goto right marker + + + + Transport: Toggle Loop section + + + + Transport: Toggle Record + + + + Edit: Copy + + + + Edit: Undo + + + + Edit: Redo + + + + Edit: Cut + + + + Edit: Paste, + + + + Edit: Delete + + + + File: New project + + + + File: Open from disk + + + + File: Save project + + + + File: Open recent file + + + + File: Save as + + + + File: Load template + + + + File: Import midi file + + + + File: Export midi file + + + + File: Import audio file + + + + File: Quit MusE + + + + Edit: Select parts on track + + + + Open pianoroll + + + + Open drumeditor + + + + Open listeditor + + + + Open graphical mastertrack editor + + + + Open list mastertrack editor + + + + Open midi transformer + + + + Add midi track + + + + Add drum track + + + + Add wave track + + + + Add audio output + + + + Add audio group + + + + Add audio input + + + + Add audio aux + + + + Structure: Global cut + + + + Structure: Global insert + + + + Structure: Global split + + + + Structure: Copy range + + + + Structure: Cut events + + + + View: Open mixer window + + + + View: Toggle transport window + + + + View: Toggle bigtime window + + + + View: Open marker window + + + + Settings: Follow song by page + + + + Settings: Follow song off + + + + Settings: Follow song continuous + + + + Settings: Global configuration + + + + Settings: Configure shortcuts + + + + Settings: Configure metronome + + + + Settings: Midi sync configuration + + + + Settings: Midi file export configuration + + + + Settings: Appearance settings + + + + Settings: Midi ports / Soft Synth + + + + Settings: Audio subsystem configuration + + + + Midi: Edit midi instruments + + + + Midi: Open midi input transform + + + + Midi: Open midi input filter + + + + Midi: Midi input transpose + + + + Midi: Midi remote control + + + + Midi: Random rhythm generator + + + + Midi: Reset midi + + + + Midi: Init midi + + + + Midi: Midi local off + + + + Audio: Bounce audio to track + + + + Audio: Bounce audio to file + + + + Audio: Restart audio + + + + Automation: Mixer automation + + + + Automation: Take mixer snapshot + + + + Automation: Clear mixer automation + + + + Help: Open Manual + + + + Help: Toggle whatsthis mode + + + + Edit: Edit selected part + + + + Edit: Select nearest part on track above + + + + Edit: Add nearest part on track above + + + + Edit: Select nearest part on track below + + + + Edit: Add nearest part on track below + + + + Midi: Transpose + + + + Edit: Select all + + + + Edit: Select none + + + + Edit: Invert selection + + + + Edit: Select events/parts inside locators + + + + Edit: Select events/parts outside locators + + + + Edit: Select nearest part/event to the left + + + + Edit: Add nearest part/event to the left to selection + + + + Edit: Add nearest part/event to the right to selection + + + + Edit: Set locators to selection + + + + Edit: Increase pitch + + + + Edit: Decrease pitch + + + + Edit: Set fixed length on midi events + + + + Quantize: Over Quantize + + + + Quantize: Note On Quantize + + + + Quantize: Note On/Off Quantize + + + + Quantize: Iterative Quantize + + + + Quantize: Configure quant + + + + Quantize: Modify Gate Time + + + + Quantize: Modify Velocity + + + + Edit: Crescendo + + + + Edit: Thin Out + + + + Edit: Erase Event + + + + Edit: Note Shift + + + + Edit: Move Clock + + + + Edit: Copy Measure + + + + Edit: Erase Measure + + + + Edit: Delete Measure + + + + Edit: Create Measure + + + + Edit: Change event color + + + + Tool: Pointer + + + + Tool: Pencil + + + + Tool: Eraser + + + + Tool: Line Draw + + + + Tool: Scissor + + + + Tool: Glue + + + + Tool: Mute + + + + Transport: Increase current position + + + + Transport: Decrease current position + + + + Quantize: Set quantize to 1/1 note + + + + Quantize: Set quantize to 1/2 note + + + + Quantize: Set quantize to 1/4 note + + + + Quantize: Set quantize to 1/8 note + + + + Quantize: Set quantize to 1/16 note + + + + Quantize: Set quantize to 1/32 note + + + + Quantize: Set quantize to 1/64 note + + + + Quantize: Toggle triol quantization + + + + Quantize: Toggle punctuation quantization + + + + Quantize: Toggle punctuation quantization (2) + + + + Edit: Insert at location + + + + Insert Note + + + + Insert SysEx + + + + Insert Ctrl + + + + Insert Meta + + + + Insert Channel Aftertouch + + + + Insert Key Aftertouch + + + + Edit: Increase event position + + + + Edit: Decrease event position + + + + Insert Tempo + + + + Insert Signature + + + + Change Event Position + + + + Edit Event Value + + + + + ShortcutConfigBase + + Configure Keyboard Shortcuts + + + + Shortcut Category + + + + Description + + + + Shortcut + + + + &Clear + + + + Alt+C + + + + &Define + + + + Alt+D + + + + &Apply + + + + Alt+A + + + + + SimpleDrumsGuiBase + + DrumSynth 0.1 + + + + + TList + + Delete Track + Spur Lschen + + + + TempoSig + + Tempo/Sig + + + + + Transport + + Punch In + + + + Loop + Schleife + + + Punch Out + + + + Left Mark + + + + Right Mark + + + + Overdub + + + + Replace + + + + Rec Mode + + + + Normal + + + + Mix + + + + Cycle Rec + + + + punchin + + + + loop + + + + punchout + + + + rewind to start + + + + rewind + + + + forward + + + + stop + + + + play + + + + record + + + + AC + + + + quantize during record + + + + Click + + + + metronom click on/off + + + + Sync + + + + external sync on/off + + + + Master + + + + use master track + + + + + TransposeDialogBase + + MusE: Midi Transpose + + + + Value + + + + halftones + + + + Time + + + + all + + + + between markers + + + + Parts + + + + all in selected tracks + + + + OK + + + + Cancel + + + + + VelocityBase + + MusE: Modify Velocity + + + + Range + + + + All Events + + + + Selected Events + + + + Looped Events + + + + Selected & Looped + + + + Values + + + + Rate: + + + + Offset: + + + + % + + + + OK + + + + Cancel + + + + + WaveEdit + + Normalize + Normalisieren + + + + WaveTrackInfoBase + + Track Info + Spur Info + + + Track Name + Spur Name + + + MusE: TrackInfo + + + + off + + + + Track Delay (ticks) + + + + Delay + + + + Delay (Frames) + + + + diff --git a/muse/share/locale/muse_es.qm b/muse/share/locale/muse_es.qm new file mode 100644 index 00000000..d21aa030 Binary files /dev/null and b/muse/share/locale/muse_es.qm 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 @@ + + + + + Click this button to enable recording + Pulsa este bot� para habilitar la grabaci� + + + sets amount of quantization: +0 - no quantization +100 - full quantization + selecciona la cantidad de cuantizaci�: +0 - sin cuantizar +100 - cuantizaci� completa + + + select Pointer Tool: +with the pointer tool you can: + select parts + move parts + copy parts + selecciona la Herramienta de Puntero: +con la herramienta de puntero puedes: + seleccionar partes + mover partes + copiar partes + + + Insert Note + Insertar nota + + + Insert SysEx + Insertar sistema exclusivo + + + Insert Ctrl + Insertar controlador + + + Insert Meta + Insertar Meta + + + Insert Channel Aftertouch + Insertar AfterTouch de canal + + + Insert Key Aftertouch + Insertar AfterTouch de tecla + + + + @default + + Click this button to open a <em>new song</em>.<br>You can also select the <b>Open command</b> from the File menu. + Pulsa este bot� para abrir una <em>nueva canci�</em>Puedes usar tambi� el comando <b>Abrir</b> del me de archivo + + + 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. + 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 + + + Create New Song + Crea una nueva Canci� + + + Click this button to stop playback + Pulsa este bot� para parar la reproducci� + + + Click this button to start playback + Pulsa este bot� para iniciar la reproducci� + + + Click this button to rewind to start position + Pulsa este bot� para regresar al principio + + + Click this button to rewind + Pulsa este bot� para ir hacia atr� + + + Click this button to forward current play position + Pulsa este bot� para adelantar la posici� de reproducci� + + + don't quantize notes above this tick limit + no cuantices notas por encima de este l�ite de tick + + + quantize also note len as default + cuantiza tambi� la longitud de la nota al valor por defecto + + + loop between left mark and right mark + hace un bucle entre las marcas de izquierda y derecha + + + record starts at left mark + la grabaci� comienza en la marca izquierda + + + record stops at right mark + la grabaci� termina en la merca derecha + + + rewind to start position + retrocede a la posici� de inicio + + + rewind current position + retrasa la posici� actual + + + move current position + mueve la posici� actual + + + stop sequencer + para el secuenciador + + + start sequencer play + inicia el secuenciador + + + to record press record and then play + para grabar pulsa grabar y despu� reproducir + + + send note off to all midi channels + envia un apagado de nota (note off) a todos los canales midi + + + select Pencil Tool: +with the pencil tool you can: + create new parts + modify length of parts + selecciona la Herramienta de L�iz: +con la herramienta de l�iz puedes: + crear nuevas partes + modificar la longitud de las partes + + + select Delete Tool: +with the delete tool you can delete parts + selecciona la Herramienta de Borrado: +con la herramienta de borrado puedes borrar partes + + + select Cut Tool: +with the cut tool you can split a part + selecciona la Herramienta de Corte: +con la herramienta de core puedes partir una parte + + + select Glue Tool: +with the glue tool you can glue two parts + selecciona la Herramienta de Pegado: +con la herramienta de pegado puedes unir dos partes + + + select Score Tool: + + selecciona la Herramienta de Partitura: + + + + select Quantize Tool: +insert display quantize event + selecciona la Herramianta de Cuantizaci�: +inserta un evento de cuantizaci� de visualizaci� + + + select Drawing Tool + selecciona la Herramienta de Dibujo + + + select Muting Tool: +click on part to mute/unmute + selecciona la Herramienta de Silenciar: +haz click en una parte para silenciar/des-silenciar + + + pointer + puntero + + + pencil + l�iz + + + rubber + goma + + + cutter + cortador + + + score + partitura + + + glue + pegamento + + + quantize + cuantizador + + + draw + dibujar + + + mute parts + silenciar partes + + + Off + Apagar + + + presets (*.pre *.pre.gz *.pre.bz2) + preselecciones (*.pre *.pre.gz *.pre.bz2) + + + All Files (*) + Todos los archivos (*) + + + Add Midi Track + A�dir pista MIDI + + + Add Wave Track + A�dir pista de audio + + + Add Audio Output + + + + Add Audio Group + + + + Add Audio Input + + + + Add Aux Send + + + + Click this button to enable recording + Pulsa este bot� para habilitar la grabaci� + + + Midi Strips + + + + Add Midi Output Port + + + + Add Midi Input Port + + + + Audio Strips + + + + + AboutBox + + AboutBox + + + + Keep On Rocking! + + + + 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 + + + + + Appearance + + MusE: load image + MusE: carga imagen + + + handle of transport window + gestor de la ventana de transporte + + + track activity in arranger + actividad de tramos en el arreglador + + + bigtime font color + color de fuente bigtime + + + bigtime background color + color de fondo de bigtime + + + waveedit background color + color de fondo de edici� de onda + + + + AppearanceDialogBase + + MusE: Appearance settings + MusE: Configuraci� de apariencia + + + Apply + Aplicar + + + Ok + Aceptar + + + Cancel + Cancelar + + + Arranger + Arreglador + + + Parts + Partes + + + show frames + mostrar frames + + + show names + mostrar nombres + + + show events + mostrar eventos + + + show Cakewalk Style + mostrar al estilo de Cakewalk + + + Events + Eventos + + + note on + nota on + + + poly pressure + presi� polif�ica + + + controller + controlador + + + aftertouch + aftertouch + + + pitch bend + pitch bend + + + program change + cambio de programa + + + special + especial + + + Background picture + Imagen de fondo + + + bg + fondo + + + select... + selecciona... + + + show snap grid + muestra la rejilla de captura + + + Colors + Colores + + + Items + Objetos + + + selected + seleccionado + + + current: + actual: + + + change... + cambia... + + + dynamic colors for track activity in arranger + colores din�icos para actividad en el arreglador + + + Style/Fonts + Estilo/Tipografia + + + QT Theme + tema QT + + + Windows + Ventanas + + + MusE + MusE + + + Metal + Metal + + + Norwegian Wood + Madera Noruega + + + Platinum + Platino + + + CDE + CDE + + + Motif + Motif + + + Motif Plus + Motif Plus + + + Fonts + Tipografia + + + Family + Familia + + + Size + Tama� + + + Font 1 + Tipografia 1 + + + Font 2 + Tipografia 2 + + + Font 3 + Tipografia 3 + + + Font 0 + Tipografia 0 + + + Bold + Negrita + + + Italic + Cursiva + + + ... + ... + + + Font 4 + Tipografia 4 + + + Font 5 + Tipografia 5 + + + Palette + + + + add to palette + + + + B + + + + S + S + + + H + + + + V + + + + G + + + + R + R + + + Itemdsfkajlk jölk ljfölajföajföajf + + + + + Arranger + + Cursor + Cursor + + + Snap + Snap + + + Len + Longitud + + + NO + No + + + TrackInfo + Informaci� de pista + + + Track + Pista + + + Type + Tipo + + + midi song type + tipo de canci� midi + + + Pitch + Tono + + + midi pitch + tono midi + + + global midi pitch shift + desplazamiento de tono midi + + + Tempo + Tempo + + + midi tempo + tempo midi + + + O-Port + Port de Salida + + + Arranger + Arreglador + + + Off + apagado + + + Bar + comp� + + + GM + GM + + + GS + GS + + + XG + XG + + + N + N + + + R + R + + + A + A + + + M + M + + + S + S + + + C + C + + + Ch + Ch + + + T + T + + + Master + Maestro + + + Group A + Grupo A + + + Group B + Grupo B + + + Group C + Grupo C + + + Group D + Grupo D + + + + AudioConfBase + + MusE: Audio Configuration + MusE: Configuraci� de Audio + + + &Apply + &Aplicar + + + &OK + C&orrecto + + + &Cancel + &Cancelar + + + Audio Parameters + Par�etros de Audio + + + 32 + 32 + + + 64 + 64 + + + 128 + 128 + + + 256 + 256 + + + 512 + 512 + + + 1024 + 1024 + + + 2048 + 2048 + + + 4096 + 4096 + + + Frame Size: + Tama� de ventana: + + + Delay: + Retardo: + + + Sample Rate: + Velocidad de muestreo: + + + 44100 + 44100 + + + 48000 + 48000 + + + 96000 + 96000 + + + Audio Driver + Controlador de Audio + + + Use Alsa + Usa Alsa + + + Use JACK + Usa Jack + + + No Audio + Sin Audio + + + Status: + Estado: + + + TextLabel6 + EtiquetadeTexto16 + + + + AudioMixerApp + + 1/2 channel + Canales 1/2 + + + pre fader - post fader + pre fader - port fader + + + record + grabar + + + mute + silencio + + + pre fader listening + monitorizar pre fader + + + record downmix + downmix de grabaci� + + + off + apagado + + + output routing + ruteado de entrada + + + &Config + &Configuraci� + + + Add Input Strip + A�dir canal de entrada + + + S + S + + + Pre + Pre + + + dB + dB + + + MusE: Audio Mixer + MusE: Mezclador de audio + + + Inputs + Entradas + + + Synthi + Entrada de sintetizador + + + Tracks + Pistas + + + Groups + Grupos + + + Master + Maestro + + + Group A + Grupo A + + + Group B + Grupo B + + + Group C + Grupo C + + + Group D + Grupo D + + + + AudioStrip + + off + apagado + + + Pan + Bal + + + S + S + + + 1/2 channel + Canales 1/2 + + + Pre + Pre + + + pre fader - post fader + pre fader - port fader + + + dB + dB + + + record + grabar + + + mute + silencio + + + record downmix + downmix de grabaci� + + + pre fader listening + monitorizar pre fader + + + output routing + ruteado de entrada + + + + BigTime + + MusE: Bigtime + MusE: Big Time + + + + ClipListEdit + + MusE: Clip List Editor + MusE: Editor de lista de clips + + + + ClipListEditorBase + + MusE: ClipList + MusE: Lista de Clips + + + Name + Nombre + + + Refs + Referencias + + + Start + Inicio + + + Len + Longitud + + + Data + Datos + + + Clip Properties + Propiedades del Clip + + + Pos: + Posici�: + + + Len: + Longitud: + + + + CommentBase + + Form1 + Form1 + + + Track Comment + Comentario de la pista + + + Track 1 + Pista 1 + + + + ConfigMidiCtrlBase + + MusE: Config Midi Controller + + + + Midi Port: + + + + Available Controller: + + + + Add + + + + Remove + + + + Automated Controller: + + + + &OK + + + + &Cancel + &Cancelar + + + + ConfigMidiFileBase + + MusE: Config Midi File Export + + + + &OK + + + + &Cancel + &Cancelar + + + 0 (single track) + + + + 1 (multiple tracks) + + + + Format: + + + + 96 + 96 + + + 192 + 192 + + + 384 + 384 + + + Division: + + + + Copyright: + + + + Enable extended smf format + Habilita el formato extendido de smf + + + + ConfigTrackListBase + + MusE: Config Track List + + + + Track Type: + + + + Audio Output + + + + Audio Group + + + + Audio Aux + + + + Wave Track + + + + Audio Input + + + + Soft Synthesizer + + + + Midi Track + + + + Drum Track + + + + Available Items: + + + + Add + + + + Remove + + + + Up + Arriba + + + Down + Abajo + + + Configured Items + + + + Track Name Size: + + + + &OK + + + + &Cancel + &Cancelar + + + + CtrlPanel + + select controller + selecciona controlador + + + remove panel + quitar panel + + + other ... + otro ... + + + Sel + Sel + + + x + x + + + Velocity + Velocidad + + + Pitch + Tono + + + + DeicsOnzeGuiBase + + DeicsOnze + + + + &Presets + + + + LBA + + + + Subcategory + + + + PRO + + + + Preset + Preselecci� + + + Bank numerous + + + + NONE + + + + Program numerous + + + + INITVOICE + + + + DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence + + + + HBA + + + + Category + + + + &Global + + + + Op4 Feedback + + + + Feedback level of the operator 4 + + + + Master Volume + + + + Master volume + + + + Modulation Matrix + + + + <b>Algorithm 1</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 2</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by both <i>Op 3</i> and <i>Op 4</i><br> +<b>Algorithm 3</b> : <i>Op 1</i> modulated by both <i>Op 4</i> and <i>Op 2</i> modulated by <i>Op 3</i><br> +<b>Algorithm 4</b> : <i>Op 1</i> modulated by both <i>Op 2</i> and <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 5</b> : (<i>Op 1</i> modulated by <i>Op 2</i>) add to (<i>Op 3</i> modulated by <i>Op 4</i>) <br> +<b>Algorithm 6</b> : addition of the three <i>Op 1, 2, 3</i> all modulated by <i>Op 4</i><br> +<b>Algorithm 7</b> : addition of the three <i>Op 1, 2, 3</i> with <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 8</b> : addition of the four <i>Op 1, 2, 3, 4</i> + + + + LFO + LFO + + + LFO Sync + + + + Pitch modulation sensitivity + + + + Pitch Modulation Sensitivity + + + + LFO Delay + + + + LFO delay + + + + LFO speed + + + + Amplitude modulation depth + + + + Pitch modulation depth + + + + Amplitude modulation sensitivity + + + + Amplitude Modulation Sensitivity + + + + AMS + + + + LFO Waveform + + + + Pitch Modulation Depth + + + + PMD + + + + LFO Speed + + + + AMD + + + + Speed + Velocidad + + + Delay + + + + PMS + + + + Pitch Envelope + + + + PL3 + + + + PL2 + + + + PL1 + + + + PR1 + + + + PR2 + + + + PR3 + + + + Op &1 + + + + OUT 1 + + + + Output Volume + + + + Volume + Volumen + + + Frequency 1 + + + + Coarse 1 + + + + Coarse Ratio + + + + Fine 1 + + + + Fine Ratio + + + + Freq 1 + + + + Fixed Frequency + + + + FIX + + + + Toggle Fix Frequency + + + + Sensitivity 1 + + + + KVS1 + + + + AME1 + + + + Amplitude Modulation Enable + + + + Keyboard Velocity Sensitivity + + + + Key Velocity Sensitivity + + + + EBS1 + + + + EG Bias Sensitivity + + + + Eg Bias Sensitivity + + + + Detune, OSCWave, EGShift 1 + + + + DET1 + + + + Detune + Desafinaci� + + + Attack Rate of the operator 1 + + + + 96dB + + + + 48dB + + + + 24dB + + + + 12dB + + + + EG Shift + + + + Wave form + + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + Amplitude Envelope 1 + + + + RR1 + + + + D1R1 + + + + D1L1 + + + + D2R1 + + + + Release Rate + + + + 2° Decay Rate + + + + 1° Decay Level + + + + 1° Decay Rate + + + + Attack Rate + + + + AR1 + + + + Scaling 1 + + + + LS1 + + + + RS1 + + + + Rate Scaling + + + + Level Scaling + + + + Op &2 + + + + Sensitivity 2 + + + + EBS2 + + + + KVS2 + + + + AME2 + + + + Detune, OSCWave, EGShift 2 + + + + DET2 + + + + OUT 2 + + + + Scaling 2 + + + + LS2 + + + + RS2 + + + + Frequency 2 + + + + Coarse 2 + + + + Fine 2 + + + + Freq 2 + + + + Amplitude Envelope 2 + + + + D1R2 + + + + D1L2 + + + + D2R2 + + + + RR2 + + + + AR2 + + + + Op &3 + + + + Sensitivity 3 + + + + EBS3 + + + + KVS3 + + + + AME3 + + + + Detune, OSCWave, EGShift 3 + + + + DET3 + + + + Frequency 3 + + + + Coarse 3 + + + + Fine 3 + + + + Freq 3 + + + + OUT 3 + + + + Scaling 3 + + + + LS3 + + + + RS3 + + + + Amplitude Envelope 3 + + + + D1R3 + + + + D1L3 + + + + D2R3 + + + + RR3 + + + + AR3 + + + + Op &4 + + + + Sensitivity 4 + + + + EBS4 + + + + KVS4 + + + + AME4 + + + + Detune, OSCWave, EGShift 4 + + + + DET4 + + + + OUT 4 + + + + Scaling 4 + + + + LS4 + + + + RS4 + + + + Frequency 4 + + + + Coarse 4 + + + + Fine 4 + + + + Freq 4 + + + + amplitude Envelope 4 + + + + AR4 + + + + D1R4 + + + + D1L4 + + + + D2R4 + + + + RR4 + + + + &Fun + + + + Phony Mode + + + + POLY + + + + MONO + + + + Reverb + Reverberaci� + + + Foot Control + + + + Pitch Bend Range + + + + Amplitude + + + + Pitch + Tono + + + Modulation Wheel + + + + Breath Control + + + + Envelope Bias + + + + Pitch Bias + + + + After Touch + After Touch + + + Potamento + + + + FINGER + + + + FULL + + + + Portamento Mode + + + + PT + + + + Portamento Time + + + + Foot Switch + + + + Sustain + Sostenido + + + Portamento + + + + Transpose + Transponer + + + &Config + + + + Configuration File + + + + Save + Guardar + + + Load + Cargar + + + Quality + + + + High + + + + Middle + + + + Low + + + + NbrV + + + + Number of Voices + + + + Colors + + + + Red + + + + Green + + + + Blue + + + + Text + Texto + + + Background + + + + Edit Text + + + + Edit Background + + + + Save Mode + + + + Save only the used presets into the project + + + + Save the entire set into the project + + + + Save the configuration into the project + + + + + DrumEdit + + Load Map + Carga Mapa + + + Save Map + Guarda Mapa + + + &Edit + &Editar + + + Cut + Cortar + + + Copy + Copiar + + + Paste + Pegar + + + Delete Events + Borrar Eventos + + + Select All + Seleccionar todo + + + Select None + Deseleccionar + + + Invert + Invertir + + + Inside Loop + Bucle interior + + + Outside Loop + Bucle exterior + + + &Select + &Seleccionar + + + Step Record + Parar Grabaci� + + + Midi Input + Entrada MIDI + + + Add Controller View + A�dir Controlador + + + M + M + + + Sound + Sonido + + + QNT + QNT + + + E-Note + Nota-E + + + Len + Longitud + + + A-Note + Nota-A + + + Ch + Ch + + + Port + Puerto + + + LV1 + VL1 + + + LV2 + VL2 + + + LV3 + VL3 + + + LV4 + VL4 + + + &File + &Fichero + + + Load Drummap + Cargar mapa de percusi� + + + Store Drummap + Guardar mapa de percusi� + + + ctrl + control + + + drummaps + mapas de percusi� + + + Muse: Load Drum Map + MusE: Cargar mapa de percusi� + + + MusE: Store Drum Map + MusE: Guardar mapa de percusi� + + + + EditCAfterDialog + + Time Position + Posici� de tiempo + + + Pressure + Presi� + + + MusE: Enter Channel Aftertouch + MusE: Introduce el AfterTouch del canal + + + + EditCtrl14Dialog + + Time Position + Posici� de tiempo + + + Controller-H + Controlador-H + + + Controller-L + Controlador-L + + + Value + Valor + + + MusE: Enter Controller14 Event + MusE: Introduce el evento del controlador 14 + + + + EditCtrl7Dialog + + Time Position + Posici� de tiempo + + + Controller + Controlador + + + Value + Valor + + + MusE: Enter Controller Event + MusE: Introduce el evento del controlador + + + + EditCtrl7DialogBase + + MusE: Enter Controller + MusE: Introduce controlador + + + Controller: + Controlador: + + + Time Position: + Posici� de tiempo: + + + Value: + Valor: + + + controller value + valor del controlador + + + OK + Aceptar + + + Cancel + Cancelar + + + + EditCtrlBase + + MusE: Edit Controller Event + + + + Time Position + Posici� de tiempo + + + Available Controller: + + + + Create New Controller + + + + Value + Valor + + + Controller + Controlador + + + H-Bank + Banco-H + + + L-Bank + Banco-L + + + Program + + + + off + apagado + + + &OK + + + + &Cancel + &Cancelar + + + Midi Port: + + + + Midi Channel: + + + + Time Position: + + + + Patch Name + + + + + EditEventDialog + + Ok + Aceptar + + + Cancel + Cancelar + + + + EditInstrumentBase + + MusE: Instrument Editor + + + + Patches + + + + Patch Name: + + + + High Bank: + + + + Low Bank: + + + + Program: + + + + d.c. + dont care + + + + d.c. + + + + Patch/Group + + + + &Delete + &Borrar + + + Alt+D + + + + &New Patch + + + + Alt+N + + + + New Group + + + + Drum + Percusi� + + + GM + GM + + + GS + GS + + + XG + XG + + + Controller + Controlador + + + Predefined Controller: + + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Properties + + + + Name + Nombre + + + Type + Tipo + + + Control7 + + + + Control14 + + + + RPN + RPN + + + NRPN + NRPN + + + Pitch + Tono + + + Program + + + + H-Ctrl + + + + Midi Controller Number High Byte + + + + L-Ctrl + + + + Midi Controller Number Low Byte + + + + Range + Rango + + + Min + + + + Max + + + + Default + + + + Name + + + + Type + + + + Min Val + + + + Max Val + + + + list of defined controllers + Lista de controladores definidos + + + This is the MusE list of defined controllers. + Esta es la lista de controladores definidos en MusE. + + + SysEx + Sistema Exclusivo + + + Initialization + + + + Panic + + + + Hex Entry: + + + + &File + + + + Tools + Herramientas + + + New + Nueva + + + &New + &Nuevo + + + Ctrl+N + + + + Open + Abrir + + + &Open... + &Abrir... + + + Ctrl+O + + + + Save + Guardar + + + &Save + &Guardar + + + Ctrl+S + + + + Save As + Guardar como + + + Save &As... + Guardar &Como... + + + Exit + Salir + + + E&xit + &Salir + + + + EditMetaDialog + + Time Position + Posici� de tiempo + + + Meta Type + Tipo de Meta + + + Enter Hex + Introduzca en Hexadecimal + + + MusE: Enter Meta Event + MusE: Introduzca evento Meta + + + + EditMetaDialogBase + + MusE: Enter Meta Event + MusE: Introduzca evento Meta + + + OK + Aceptar + + + Cancel + Cancelar + + + TextLabel1 + EtiquetaTexto1 + + + Time Position: + Posici� de tiempo + + + Meta Type: + Tipo de Meta: + + + Enter Hex + Escribe Hexadecimal + + + + EditNoteDialogBase + + MusE: Enter Note + MusE: Escribe Nota + + + OK + Aceptar + + + Cancel + Cancelar + + + Length: + Longitud: + + + Time Position: + Posici� de tiempo + + + Pitch: + Tono: + + + Velocity On: + Velocidad On: + + + Velocity Off: + Velocidad Off: + + + + EditPAfterDialog + + Time Position + Posici� de tiempo + + + Pitch + Tono + + + Pressure + Presi� + + + MusE: Enter Poly Aftertouch + Muse: Escribe el aftertouch polif�ico + + + + EditPitchDialog + + Time Position + Posici� de tiempo + + + Pitch + Tono + + + MusE: Enter Pitch Shift + MusE: Introduce el deplazamiento de tono + + + + EditSysexDialogBase + + MusE: Enter SysEx + MusE: Introduce el sistema exclusivo + + + TimePosition: + Posici� de tiempo: + + + Comment: + Comentario: + + + OK + Aceptar + + + Cancel + Cancelar + + + Known SysEx: + + + + Add + + + + + EditToolBar + + Edit Tools + Editar herramientas + + + + EffectRack + + effect rack + rack de efectos + + + move up + subir + + + move down + bajar + + + remove + quitar + + + bypass + saltar + + + show gui + mostrar gui + + + new + nuevo + + + change + cambiar + + + + FLUIDGuiBase + + Form1 + Formulario1 + + + Soundfont + Fuente de sonido + + + Load + Cargar + + + + FLUIDSynthGuiBase + + FLUID Synth + + + + Load + Cargar + + + Delete + + + + Dump Info + + + + ID + + + + Fontname + + + + Chnl + + + + Soundfont + Fuente de sonido + + + Drum Chnl + + + + Level + Nivel + + + Width + Anchura + + + Damping + Amortiguamiento + + + Room Size + Tama� estancia + + + Reverb + Reverberaci� + + + CHANNEL SETUP + + + + Sine + Seno + + + Triangle + Tri�gulo + + + Type + Tipo + + + Number + Nmero + + + Speed + Velocidad + + + Depth + Profundidad + + + Chorus + Coro ;-) + + + Gain + Ganancia + + + LOADED SOUNDFONTS + + + + + FileDialogButtons + + Form1 + Formulario1 + + + Global + Global + + + User + Usuario + + + Project + Proyecto + + + Load: + + + + Songdata + +Cofiguration + + + + only +Songdata + + + + + FontSel + + Size: + Tama�: + + + + GateTimeBase + + MusE: Modify Gate Time + MusE: Modifica el timpo de puerta + + + Range + Rango + + + All Events + Todos los eventos + + + Selected Events + Eventos seleccionados + + + Looped Events + Eventos en bucle + + + Selected & Looped + Seleccionados y en bucle + + + Values + Valores + + + Rate: + Velocidad: + + + Offset: + Desplazamiento: + + + % + % + + + OK + Aceptar + + + Cancel + Cancelar + + + + GlobalSettingsDialogBase + + MusE: Global Settings + MusE: Valores globales + + + Audio + Audio + + + Mixer + Mezclador + + + dB + dB + + + min. Meter Value + valor m�imo del vumeter + + + min.Slider Val + valor m�imo del desplazador + + + Midi + MIDI + + + Ticks + Ticks + + + 1024 + 1024 + + + 2048 + 2048 + + + 4096 + 4096 + + + 8172 + 8172 + + + Displayed Resolution +(Ticks/Quarternote) + Resoluci� mostrada +(ticks/negra) + + + 48 + 48 + + + 96 + 96 + + + 192 + 192 + + + 384 + 384 + + + 768 + 768 + + + 1536 + 1536 + + + 3072 + 3072 + + + 6144 + 6144 + + + 12288 + 12288 + + + RTC Resolution +(Ticks/Sec) + Resoluci� del reloj +(Ticks/segundo) + + + GUI + GUI + + + /sec + /seg + + + GUI Refresh Rate + Velocidad de refresco del GUI + + + &Apply + &Aplicar + + + &Ok + Ac&eptar + + + &Cancel + &Cancelar + + + Help Browser: + Navegador de ayuda: + + + Application + + + + Start Muse + + + + start with last song + + + + start with song + + + + start song: + + + + Views + + + + y-pos + + + + show + + + + x-pos + + + + height + + + + width + + + + Big Time + + + + Arranger + Arreglador + + + Transport + + + + Cur + + + + set current values + + + + start with template: default.med + + + + show splash screen + + + + use JACK freewheel mode if possible + + + + Mixer 1 + + + + Mixer 2 + + + + + IIWUGuiBase + + Form1 + Formulario1 + + + Soundfont + Fuente de sonido + + + Load + Cargar + + + + IIWUSynthGuiBase + + IIWU Synth + Sintetizador IIWU + + + Gain + Ganancia + + + Room Size + Tama� estancia + + + Damping + Amortiguamiento + + + Level + Nivel + + + Width + Anchura + + + Speed + Velocidad + + + Depth + Profundidad + + + Number + Nmero + + + Type + Tipo + + + Sine + Seno + + + Triangle + Tri�gulo + + + Reverb + Reverberaci� + + + Chorus + Coro ;-) + + + Pop + Pop 8-? + + + Push + Empuje + + + ... + ... + + + show iiwusynth controls + mostrar controles del sintetizador iiwu + + + Load + Cargar + + + Save + Guardar + + + + LMaster + + new tempo + nuevo tempo + + + new signature + nuevo comp� + + + Meter + Metr�omo + + + Time + Tiempo + + + Type + Tipo + + + Value + Valor + + + MusE: Mastertrack + MusE: Pista maestra + + + Tempo + Tempo + + + Timesig + comp� + + + + ListEdit + + &Edit + &Editar + + + Cut + Cortar + + + Copy + Copiar + + + Paste + Pegar + + + List Tools + Lista de herramientas + + + Insert Tools + Insertar herramientas + + + Delete Events + Borrar eventos + + + Insert Note + Insertar nota + + + insert Note + insertar Nota + + + Insert SysEx + Insertar sistema exclusivo + + + insert SysEx + insertar sistema exclusivo + + + Insert Ctrl + Insertar controlador + + + insert Ctrl + insertar controlador + + + Insert Meta + Insertar Meta + + + insert Meta + insertar Meta + + + Insert Pitch + Insertar Tono + + + insert Pitch + insertar Tono + + + Insert Channel Aftertouch + Insertar AfterTouch de canal + + + insert Channel Aftertouch + insertar AfterTouch de canal + + + Insert Key Aftertouch + Insertar AfterTouch de tecla + + + insert Poly Aftertouch + insertar AfterTouch Polif�ico + + + Tick + Tick + + + Bar + Comp� + + + Typ + Tip + + + Ch + Cn + + + Val A + Val A + + + Val B + Val B + + + Val C + Val C + + + Len + Lon + + + Comment + Comentario + + + + MITTransposeBase + + MusE: Midi Input Plugin: Transpose + MusE: Plugin de entrada MIDI : Transposici� + + + On + Encendido + + + TriggerKey + Tecla de salto + + + Transpose: + Trasponer: + + + +0 + +0 + + + + MPConfig + + none + ninguno + + + other raw ... + otro crudo (raw) ... + + + MusE: Midi Port Table + MusE: Tabla de puertos MIDI + + + Port + Puerto + + + GUI + GUI + + + Rec + Grabar + + + Instrument + Instrumento + + + Device Name + Nombre de dispositivo + + + State + Estado + + + unknown + desconocido + + + + MRConfigBase + + MusE: Midi Input Plugin: Remote Control + MusE: Pluginde entrada MIDI : Control remoto + + + Activate + Activar + + + On + Encendido + + + Actions + Acciones + + + Stop + Parar + + + Record + Grabar + + + Goto Left Mark + Ir ala marca izquierda + + + Play + Reproducir + + + + MTScale + + bar scale + escala de compases + + + + MarkerView + + Bar:Beat:Tick + Barra:Golpe:Tick + + + Hr:Mn:Sc:Fr:Sf + Hr:Mn:Sg:Fr:Sf + + + Lock + Bloquear + + + Text + Texto + + + Marker Properties + Propiedades del marcador + + + MusE: Marker + MusE: Marcador + + + add marker + a�dir marcador + + + Add Marker + A�dir marcador + + + delete marker + borrar marcador + + + Delete Marker + Borrar Marcador + + + &File + &Archivo + + + &Edit + &Editar + + + + MasterEdit + + Cursor + Cursor + + + Snap + Snap + + + time at cursor position + tiempo en la posici� del cursor + + + tempo at cursor position + tempo en la posici� del cursor + + + CurPos + Posici� del cursor + + + tempo at current position + tempo en la posici� actual + + + time signature at current position + comp� en la posici� actual + + + Master + Maestro + + + MusE: Mastertrack + Muse: Pista Maestra + + + edit tools + editar herramientas + + + EnableMaster + Habilitar maestro + + + use master track + usar pista maestra + + + Info + Info + + + Off + Apagado + + + + MetronomeConfigBase + + MusE: Metronome Config + MusE: Configuraci� del metr�omo + + + Metronome + Metr�omo + + + Audio Beep + Bip de audio + + + MIDI Click + Click MIDI + + + Midi Channel + Canal MIDI + + + Measure Note + Nota de comp� + + + Measure Velocity + Velocidad de comp� + + + Beat Velocity + Velocidad de barra + + + Beat Note + Nota de barra + + + Midi Port + Puerto MIDI + + + Precount + Cuenta atr� + + + enable + habilitada + + + Bars + Compases + + + From Mastertrack + desde la pista Mestra + + + / + / + + + Signature + comp� + + + Prerecord + pre-grabaci� + + + Preroll + pre-escucha + + + &Apply + &Aplicar + + + &OK + Ac&eptar + + + &Cancel + &Cancelar + + + + MidiController + + Velocity + Velocidad + + + + MidiControllerEditDialog + + MusE: save midi controller list + MusE: guardar lista de controladores MIDI + + + MusE: load midi controller list + MusE: Cargar lista de controladores MIDI + + + + MidiControllerEditDialogBase + + MusE: Define Midi Controller + MusE: Define controlador MIDI + + + replace controller set + reemplazar conjunto de controladores + + + merge controller set + unir conjunto de controladores + + + save controller set as + guardar conjunto de controladores como + + + Name + Nombre + + + Type + Tipo + + + H-Ctrl + Control-H + + + L-Ctrl + Control-L + + + Min Val + Valor m�imo + + + Max Val + Valor m�imo + + + list of defined controllers + lista de controladores definidos + + + This is the MusE list of defined controllers. + Esta es la lista de controladores definidos por MusE. + + + Properties + Propiedades + + + Name + Nombre + + + Max Value + Valor m�imo + + + Min Value + Valor m�imo + + + Control7 + Control7 :-? + + + Control14 + Control14 + + + RPN + RPN + + + NRPN + NRPN + + + XG-SysEx + Sys-Ex-XG + + + SysEx + Sistema Exclusivo + + + Type + Tipo + + + &New + &Nuevo + + + create new entry + crear entrada nueva + + + pressing the New button you create a new entry +in the MusE list of defined controllers + pulsando el bot� se crear�una nueva +clase de controladores en la lista de MusE. + + + &Delete + &Borrar + + + delete selected entry + borra la clase seleccionada + + + &OK + &Aceptar + + + &Cancel + &Cancelar + + + &Add + + + + Alt+A + + + + Predefined Controller: + + + + Managed Controller for Port + + + + Channel + Canal + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Pitch + Tono + + + Program + + + + Midi Controller Number High Byte + + + + Midi Controller Number Low Byte + + + + Range + Rango + + + + MidiFileConfig + + Enable extended smf format + Habilita el formato extendido de smf + + + Division + Divisi� + + + Copyright + Copyright + + + Config exported Midi Files + Configurar archivos MIDI exportados + + + MusE: Config exported Midi Files + MusE: configurar archivos MIDi exportados + + + + MidiFilterConfigBase + + MusE: Midi Input Filter + MusE: Filtro de entrada MIDI + + + Record Filter + Filtro de grabaci� + + + Note On + Nota on + + + Poly Pressure + Presi� polif�ica + + + Controller + Caontrolador + + + Program Change + Cambio de programa + + + After Touch + After Touch + + + Pitch Bend + Rueda de bend + + + Sysex + Sistema exclusivo + + + Thru Filter + Filtro Thru + + + Controller Filter + Filtrar controlador + + + Channel Filter + Filtro de canal + + + 14 + 14 + + + 10 + 10 + + + 6 + 6 + + + 12 + 12 + + + 4 + 4 + + + 2 + 2 + + + 9 + 9 + + + 8 + 8 + + + 3 + 3 + + + 13 + 13 + + + 15 + 15 + + + 16 + 16 + + + 7 + 7 + + + 11 + 11 + + + 5 + 5 + + + 1 + 1 + + + &Cancel + &Cancelar + + + + MidiInputTransformDialog + + New + Nueva + + + + MidiInputTransformDialogBase + + MusE: Midi Input Transformator + MusE: Transformador de entrada MIDI + + + Filter + Filtrar + + + All + Todo + + + Equal + Igual + + + Unequal + Diferente + + + Note + Nota + + + Poly Pressure + Presi� poif�ica + + + Control Change + Cambio de control + + + Aftertouch + AfterTouch + + + Pitch Bend + Rueda de modulaci� + + + NRPN + NRPN + + + RPN + RPN + + + Value 2 + Valor 2 + + + Value 1 + Valor 1 + + + Event Type + Tipo de Evento + + + Ignore + Ignorar + + + Higher + Mayor + + + Lower + Menor + + + Inside + Entre + + + Outside + Fuera + + + Channel + Canal + + + Port + Puerto + + + Processing + Procesando + + + Keep + Mantener + + + Fix + Arreglar + + + Plus + M� + + + Minus + Menos + + + Multiply + Multiplicar + + + Divide + Dividir + + + Invert + Invertir + + + ScaleMap + Mapa de escalado + + + Flip + cambiar + + + Dyn + Din�ico + + + Random + Aleatorio + + + Modules + M�ulos + + + 1 + 1 + + + 2 + 2 + + + 3 + 3 + + + 4 + 4 + + + enable modul 1 + habilitar m�ulo 1 + + + enable modul 2 + habilitar m�ulo 2 + + + enable modul 3 + habilitar m�ulo 3 + + + enable modul 4 + habilitar m�ulo 4 + + + Preset + Preselecci� + + + Name: + Nombre: + + + Comment: + Comentario: + + + Function + Funci� + + + &New + &Nueva + + + create new preset + crea nueva preselecci� + + + &Delete + &Borrar + + + delete preset + borra la preselecci� + + + &Dismiss + &Ocultar + + + PresetList + Lista de Preselecciones + + + + MidiPortRouteBase + + MusE: Midi Port Routing + + + + Port 2 + + + + Output + + + + Input + Entrada + + + + MidiRawDeviceDialogBase + + MusE: raw midi device configuration + NusE: Condifuraci� de dispositivo MIDI directo + + + Name + Nombre + + + Device + Dispositivo + + + Type + Tipo + + + Virt. Ports + Puertos virtuales + + + Speed + Velocidad + + + Handshaking + Control de flujo + + + Device Properties + Propiedades del dispositivo + + + Virt.Ports + Ports Virtuales + + + Raw Device + Dispositivo directo + + + Serial Port + Puerto s�ie + + + Pipe + Tuberia + + + Device Path + Direcci� del dispositivo + + + 9600 + 9600 + + + 19200 + 19200 + + + 38400 + 38400 + + + None + Ninguno + + + RTS/CTS + RTS/CTS + + + Xon/Xoff + Xon/Xoff + + + &New + &Nuevo + + + &Delete + &Borrar + + + &OK + &Aceptar + + + &Cancel + &Cancelar + + + + MidiStrip + + Var + Var + + + Rev + Rev + + + Cho + Cho + + + off + apagado + + + dB + dB + + + Pan + Bal + + + record + grabar + + + mute + silencio + + + pre fader listening + monitorizar pre fader + + + + MidiSyncConfigBase + + MusE: Midi Sync + MusE: Sincronizaci� MIDI + + + Apply + Aplicar + + + Ok + Aceptar + + + Cancel + Cancelar + + + hour + hora + + + h + h + + + minute + minuto + + + m + m + + + second + segundo + + + s + s + + + frame + frame + + + f + f + + + subframe + sub-frame + + + 24 + 24 + + + 25 + 25 + + + 30D + 30D + + + 30N + 30N + + + Id: + Id: + + + device id + id de dispositivo + + + Port: + Puerto: + + + midi port + puerto MIDI + + + Sync Source + Fuente de Sincronizaci� + + + accept MTC + aceptar MTC + + + accept Midi Clock + aceptar MIDI clock + + + accept MMC + aceptar MMC + + + Sync Gen + Generar Sync + + + Midi Time Code (MTC) + C�igo de Tiempo Midi (MTC) + + + Midi Clock + Reloj Midi + + + Midi Machine Control (MMC) + Control de m�uina MIDI (MMC) + + + Sync Mode + Modo de sincronizaci� + + + Master + Maestro + + + Slave + Esclavo + + + all + todo + + + MTC + MTC + + + Type: + Tipo: + + + Offset: + Desplazamiento: + + + + MidiTrackInfoBase + + MusE: TrackInfo + MusE: Informaci� de pista + + + output channel + canal de salida + + + all midi events are send to this output channel + todos los eventos MIDI se envian a �te canal de salida + + + Track Info + Informaci� de Pista + + + % + % + + + Track Name + Nombre de Pista + + + output port + puerto de salida + + + off + apagado + + + change stereo position + cambiar posici� estereof�ica + + + OCh. + OCh. + + + MidiThru + Midi Thru + + + ??? + ??? + + + select instrument patch + selecciona el grupo de instrumento + + + Transp. + Transposici� + + + Volume + Volumen + + + Channel Info + Informaci� de Canal + + + Pan + Balance + + + Delay + Delay + + + H-Bank + Banco-H + + + Compr. + Compr. + + + L-Bank + Banco-L + + + Progr. + Progr. + + + Velocity + Velocidad + + + Length + Longitud + + + input ports + puertos de entrada + + + IChan. + Canal de entrada + + + input channels + Canales de entrada + + + 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 + Los eventos de todos los canales configurados +se graban en esta pista. +Puedes especificar m� de un canal para grabar: + 1 2 3Graba desde los canales 1, 2 y 3 + 1-3Lo mismo + 1-3 5Graba desde los canales 1, 2, 3 y 5 + + + Rec + Grabar + + + Output Channel + + + + Modify Note Length + + + + Output Port + Puerto de salida + + + Track Delay (ticks) + + + + Compress Note Velocity + + + + Pitch Transpose + + + + Modify Note Velocity + + + + Input Ports + + + + Input Channels + + + + Select Instrument Patch + + + + Bank Select LSB + + + + Bank Select MSB + + + + Instrument High Bank + + + + Instrument Low Bank + + + + Instrument/Program/Patch + + + + + MidiTransformDialogBase + + MusE: Midi Transformator + MusE: Transformador MIDI + + + &New + &Nueva + + + &Delete + &Borrar + + + &Apply + &Aplicar + + + &OK + Ac&eptar + + + &Cancel + &Cancelar + + + PresetList + Lista de preselecciones + + + Processing + Procesando + + + Event Type + Tipo de evento + + + Keep + Mantener + + + Fix + Arreglar + + + Note + Nota + + + Poly Pressure + Presi� polif�ica + + + Control Change + Cambio de control + + + Aftertouch + AfterTouch + + + Pitch Bend + Rueda de modulaci� + + + NRPN + NRPN + + + RPN + RPN + + + Plus + M� + + + Minus + Menos + + + Multiply + Multiplicar + + + Divide + Dividir + + + Value 2 + Valor 2 + + + Invert + Invertir + + + ScaleMap + Escalado de mapa + + + Flip + Cambiar + + + Dyn + Dyn + + + Random + Aleatorio + + + Value 1 + Valor 1 + + + Length + Longitud + + + Position + Posici� + + + Filter + Filtro + + + All + Todo + + + Equal + Igual + + + Unequal + Diferente + + + Ignore + Ignora + + + Higher + Mayor + + + Lower + Menor + + + Inside + Entre + + + Outside + Fuera + + + Bar Range + Rango de compases + + + Preset + Preselecci� + + + Name: + Nombre: + + + Comment: + Comentario: + + + Range + Rango + + + process all events + procesar todos los eventos + + + selected tracks + seleccionar pistas + + + inside loop + dentro de bucle + + + Function + Funci� + + + Select + Seleccionar + + + Quantize + Cuantizar + + + Delete + Borrar + + + Transform + Transformar + + + Insert + Insertar + + + Copy + Copiar + + + Extract + Extraer + + + Quantize Value + Cuantizar valor + + + Sysex + Sistema exclusivo + + + Meta + + + + + MidiTransformerDialog + + New + Nueva + + + + MixdownFileDialog + + Wave Files (*.wav);;All Files (*) + Archivos de onda (*.wav);;Todos los archivos(*) + + + + MixdownFileDialogBase + + MusE: Set Mixdown Wavefile + MusE: Selecciona el archivo de Masterizaci� + + + &OK + &Aceptar + + + &Cancel + &Cancelar + + + File Path + Directorio del archivo + + + Channel + Canal + + + Stereo + Est�eo + + + Mono + Mono + + + 5.1 + 5.1 + + + wav,16 Bit + wav, 16 bits + + + wav, 24 Bit + wav, 24 bits + + + wav, 32 Bit (float) + wav, 32 bits + + + Format + Formato + + + + Mixer + + Mute + Silencio + + + MusE: Midi Mixer + MusE: MExclador MIDI + + + Rev + Rev + + + Cho + Cho + + + Var + Var + + + Pan + Bal + + + Master + Maestro + + + Port + Puerto + + + + MusE + + &File + &Archivo + + + Open &Recent + Abrir &Recientes + + + Save &As + Guardar c&omo + + + Config &Printer + Configurar &Impresi� + + + Import Midifile + Importar archivo MIDI + + + Export Midifile + Exportar archivo MIDI + + + Import Wave File + Importar archivo de audio + + + &Quit + &Salir + + + &Edit + &Editar + + + C&ut + C&ortar + + + &Copy + &Copiar + + + &Paste + &Pegar + + + Delete Track + Borrar pista + + + Add Track + A�dir Pista + + + Select &All + Seleccion&ar Todo + + + &Deselect All + &Deseleccionar Todo + + + Invert &Selection + Invertir &Selecci� + + + &Inside Loop + &Interior de bucle + + + &Outside Loop + &Exterior de Bucle + + + All &Parts on Track + Todas las &Partes de la pista + + + Select + Seleccionar + + + Drums + Percusi� + + + List + Lista + + + Graphic + Gr�ico + + + Mastertrack + Pista Maestra + + + Midi &Transform + &Transformaci� MIDI + + + Modify Gate Time + Modificar el tiempo de puerta + + + Modify Velocity + Modificar Velocidad + + + Crescendo + Crescendo + + + Transpose + Transponer + + + Thin Out + Adelgazar? (Thin Out) + + + Erase Event + Borrar Evento + + + Note Shift + Desplazamiento de nota + + + Move Clock + Mover reloj + + + Copy Measure + Copiar comp� + + + Erase Measure + Vaciar comp� + + + Delete Measure + Borrar comp� + + + Create Measure + Crear comp� + + + Mix Track + Mezclar pista + + + Midi + MIDI + + + &Structure + E&structura + + + Global Cut + Corte global + + + Global Insert + Inserci� Global + + + Global Split + Partici� Global + + + Copy Range + Copiar Rango + + + Cut Events + Cortar eventos + + + &Display + &Mostrar + + + Transport Panel + Panel de transporte + + + Bigtime window + ventana BigTime + + + dont follow Song + no sigas la canci� + + + follow page + sigue la p�ina + + + follow continuous + sigue cont�uamente + + + &Config + &Configuraci� + + + Global Settings + Selecciones Globales + + + follow song + seguir canci� + + + Metronome + Metr�omo + + + Midi Sync + Sincronizaci� MIDI + + + Midi File Config + Configuraci� de archivos MIDI + + + Appearance settings + Selecciones de apariencia + + + Soft Synthesizer + Sintetizador virtual + + + Midi Ports + Puertos MIDI + + + Audio System + Sistema de Audio + + + Save Configuration + Guardar configuraci� + + + Midi Input Transform + Transformaci� de entrada MIDI + + + Midi Input Filter + Filtrado de entrada MIDI + + + Midi Remote Control + Control remoto MIDI + + + Random Rhythm Generator + generador aleatorio de ritmos + + + &Midi + &MIDI + + + Mixer + Mezclador + + + Define Controller + Define Controlador + + + Input Plugins + Plugins e entrada + + + Reset Instr. + Reinicializa Instrumento + + + Init Instr. + Inicializa Instruemnto + + + local off + apagado local + + + &Audio + &Audio + + + Audio + Audio + + + Cliplist + Lista de Clips + + + Bounce to Track + Rebotar a pista + + + Bounce to File + Rebotar a Archivo + + + Bounce + Rebotar + + + &Help + A&yuda + + + Browser + Navegador + + + &About + &Acerca de + + + About&Qt + Acerca de &Qt + + + What's &This + Qu�es esto + + + MusE: load project + MusE: Carga proyecto + + + The current Project contains unsaved data +Save Current Project? + El proyecto actual contiene datos no guardados +Guardamos el proyecto actual? + + + &Save + &Guardar + + + &Nosave + &No Guardar + + + &Abort + &Abortar + + + MusE: Save As + MusE: Guardar como + + + MusE: Import Midi + MusE: Importar MIDI + + + MusE: Export Midi + MusE: Exportar MIDI + + + Nothing to edit + Nada para editar + + + The current Project contains unsaved data +Load overwrites current Project: +Save Current Project? + El proyecto actual contine datos no guardados +Cargar sobreescribe el proyecto actual: +Guardar el proyecto actual? + + + &Overwrite + S&obre escribir + + + no help found at: + no se ha encontrado ayuda en: + + + MusE: Open Help + MusE: Abre ayuda + + + to import a audio file you have first to selecta audio track + para importar un archivo de audio tienes que tener seleccionada una pista de audio + + + UndoRedo + Deshacer/Rehacer + + + undo + deshacer + + + Und&o + &Deshacer + + + redo + rehacer + + + Re&do + &Rehacer + + + undo last change to song + deshace el ltimo cambio en la canci� + + + redo last undo + rehace el ltimo deshacer + + + Transport + Transporte + + + loop + bucle + + + Loop + Bucle + + + punchin + pinchar + + + Punchin + Pinchar + + + punchout + fin pinchado + + + Punchout + Fin pinchado + + + start + empezar + + + Start + Empezar + + + rewind + retroceder + + + Rewind + Retroceder + + + forward + avanzar + + + Forward + Avanzar + + + stop + parar + + + Stop + Parar + + + play + reproducir + + + Play + Reproducir + + + record + grabar + + + Record + Grabar + + + panic + p�ico + + + Panic + P�ico + + + new + nuevo + + + &New + &Nuevo + + + open + abrir + + + &Open + &Abrir + + + save + guardar + + + pianoroll + pianola + + + Pianoroll + Pianola + + + score + partitura + + + Score + Partitura + + + marker + marcador + + + Marker + Marcador + + + File Buttons + Botones de Archivo + + + Unknown File Format + Formato de archivo desconocido + + + none + ninguno + + + MusE: Write File failed + MusE: La grabaci� del archivo ha fallado + + + MusE: About + Muse: Acerca de + + + MusE: Song: + MusE: Canci�: + + + reading midifile + + leyendo archivo midi + + + + +failed + +fall� + + + MusE: Copy Range + MusE: Copiar Rango + + + not implemented + no implementado + + + MusE: Cut Events + MusE: Cortar Eventos + + + MusE: Bounce to Track + MusE: Rebotar a la pista + + + more than one target track selected + m� de una pista de destino seleccionada + + + wrong target track type, +select wave track as target + tipo de pista err�ea, +selecciona una pista de audio como destino + + + no target track selected + no hay pista de destino seleccionada + + + Delete Selected Tracks + + + + Edit Instrument + + + + Configure shortcuts + + + + Midi File Export + + + + &Manual + + + + &MusE homepage + + + + &Report Bug... + + + + &About MusE + + + + What's &This? + + + + Cannot read template + + + + File open error + + + + File read error + + + + MusE: load template + + + + MusE: Bounce + + + + set left/right marker for bounce range + + + + MusE: Bounce to File + + + + no output track found + + + + Add midi file to current project? + + + + + &Add to Project + + + + &Replace + + + + +failed: + +fall� + + + Arranger + Arreglador + + + Cursor + Cursor + + + Off + + + + Bar + + + + Snap + Snap + + + Len + + + + Pitch + Tono + + + midi pitch + tono midi + + + global midi pitch shift + desplazamiento de tono midi + + + Tempo + Tempo + + + midi tempo + tempo midi + + + N + N + + + MusE: Create tmp file failed + + + + &View + + + + Mixer 1 + + + + Mixer 2 + + + + Setti&ngs + + + + + NoteInfo + + Start + Inicio + + + Len + Longitud + + + Pitch + Tono + + + Velo On + Velocidad On + + + Velo Off + Velocidad Off + + + Note Info + Informaci� de nota + + + + OrganGuiBase + + MusE: Organ + MusE: �gano + + + Presets + Preselecciones + + + Set + Pon + + + load preset list + cargar lista de preselecciones + + + save preset list + guardar lista de preselecciones + + + O-1 + 0-1 + + + Oscillator + Oscilador + + + Brass + Metales + + + Reed + Reed + + + Flute + Flauta + + + Drawbars + Drawbars + + + 16' + 16' + + + 4' + 4' + + + 2 2/3' + 2 2/3' + + + 2' + 2' + + + 8' + 8' + + + 5 1/3' + 5 1/3' + + + Envelope Lo + Envolvente Lo + + + Attack(ms) + Ataque (ms) + + + Decay(ms) + Decaimiento (ms) + + + Sustain(%) + Sostenido (%) + + + Release(ms) + Relajaci� (ms) + + + Envelope Hi + Envolvente Hi + + + Release + Relajaci� + + + Sustain + Sostenido + + + Decay + Decaimiento + + + Attack + Ataque + + + ms + + + + cB + + + + Velocity + Velocidad + + + + PageSettings + + Paper Size + Tama� del papel + + + user + usuario + + + Margins + M�genes + + + Header + Cabecera + + + Title + T�ulo + + + Author + Autor + + + Fonts + Tipos + + + Page No. + P�ina n + + + Measure No + Comp� n + + + Track Name + Nombre de Pista + + + Lyrics + Letra + + + Layout + Disposici� + + + Scale + Escala + + + Flags + Se�lizadores + + + show page no. + muestra el nmero de p�ina + + + show measure no. + muestra el nmero de comp� + + + show track name + muestra el nombre de la pista + + + Ok + Aceptar + + + Apply + Aplicar + + + Cancel + Cancelar + + + left Margin + Margen izquierdo + + + top Margin + Margen Superior + + + right Margin + Margen derecho + + + bottom Margin + Margen inferior + + + Bars across the Page + Barras a trav� de la p�ina + + + + PartCanvas + + C&ut + C&ortar + + + &Copy + &Copiar + + + rename + renombrar + + + delete + borrar + + + split + partir + + + glue + pegar + + + pianoroll + pianola + + + score + partitura + + + list + lista + + + drums + percusi� + + + Cannot copy/move/clone to different Track-Type + No puedo copiar/mover/clonar a un tipo diferente de pista + + + color + color + + + de-clone + des-clonar + + + wave edit + editar onda + + + Cannot paste: multiple tracks selected + No puedo pegar: mtilpes pistas seleccionadas + + + Cannot paste: no track selected + No puedo pegar: No hay pista seleccionada + + + Cannot paste midi parts to wave track + No puedo pegar MIDI en una pista de audio + + + Cannot paste wave parts to midi track + No puedo pegar audio en una pista MIDI + + + Cannot paste: wrong data type + No puedo pegar: Tipo de datos equivocado + + + + PatchBay + + MusE: ALSA MIDI Patch Bay + MusE: Panel de ruteado MIDI de ALSA + + + + PatchBayBase + + ALSA Patch Bay + Panel de ruteado de ALSA + + + + PianoRoll + + &Edit + &Editar + + + Cut + Cortar + + + Copy + Copiar + + + Paste + Pegar + + + Delete Events + Borrar eventos + + + Select All + Seleccionar Todo + + + Select None + De-seleccionar todo + + + Invert + Invertir + + + Inside Loop + Dentro del bucle + + + Outside Loop + Fuera del bucle + + + &Select + &Seleccionar + + + blue + azul + + + pitch colors + colores de tono + + + velocity colors + colores de velocidad + + + &Config + &Configurar + + + event color + color de eventos + + + &Functions + &Funciones + + + Over Quantize + Sobre cuantizar + + + Note On Quantize + Cuantizar inicio de nota + + + Note On/Off Quantize + Cuantizar inicio y final de nota + + + Iterative Quantize + Cuantizaci� iterativa + + + Pianoroll Tools + Herramientas de pianola + + + Step Record + Grabaci� por pasos + + + Midi Input + Entrada MIDI + + + Play Events + Reproducir eventos + + + Add Controller View + A�de vista de controladores + + + Config Quant... + Configura cuantizaci�... + + + Modify Gate Time + Modifica el tiempo de puerta + + + Modify Velocity + Modifica la velocidad + + + Crescendo + Crescendo + + + Transpose + Transponer + + + Thin Out + Adelgazar + + + Erase Event + Borrar evento + + + Note Shift + Desplazar nota + + + Move Clock + Mover reloj + + + Copy Measure + Copiar comp� + + + Erase Measure + Vaciar comp� + + + Delete Measure + Borrar comp� + + + Create Measure + Crear comp� + + + ctrl + control + + + + PluginDialog + + Ok + Aceptar + + + Cancel + Cancelar + + + MusE: select plugin + MusE: Selecciona el plugin + + + Lib + Lib + + + Label + Etiqueta + + + Name + Nombre + + + AI + AI + + + AO + AO + + + CI + CI + + + CO + CO + + + IP + IP + + + id + id + + + Maker + Fabricante + + + Copyright + Copyright + + + Stereo and Mono + + + + Stereo + Est�eo + + + Mono + Mono + + + All + Todo + + + 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. + + + + + PluginGui + + bypass plugin + saltar plugin + + + MusE: load preset + MusE: Cargar plantilla + + + MusE: save preset + MusE: Guardar plantilla + + + File Buttons + Archivar botones + + + Load Preset + Cargar plantilla + + + Save Preset + Guardar plantilla + + + + PrinterConfig + + MusE: Config Printer + MusE: Configuraci� de impresora + + + Print to file + Imprimir en archivo + + + Print Command + Comando de impresi� + + + Preview Command + Comando de previsualizaci� + + + OK + Aceptar + + + Cancel + Cancelar + + + + QHeader + + Port Number + Nmero de puerto + + + enable gui for device + habilitar gui para dispositivo + + + enables recording from the device + habilita la grabaci� para el dispositivo + + + Instrument connected to port + Instrumento conectado al puerto + + + State: result of opening the device + Estado: resultado de abrir el puerto + + + mute instrument + silenciar instrumento + + + sound name + nombre del sonido + + + quantisation +currently not used + cuantizaci� +actualmente sin usar + + + this input note triggers the sound + ensta nota de entrada dispara el sonido + + + note length + longitud de nota + + + this note is send for the sound + esta nota se envia al sonido + + + output channel +currently not used + canal de salida +actualmente sin uso + + + output port +currently not used + puerto de salida +actualmente sin uso + + + velocity level 1 + nivel de velocidad 1 + + + velocity level 2 + nivel de velocidad 2 + + + velocity level 3 + nivel de velocidad 3 + + + velocity level 4 + nivel de velocidad 4 + + + quantisation + cuantizaci� + + + output channel + canal de salida + + + output port + puerto de salida + + + Enable Recording + Habilita grabaci� + + + Track Activity + Actividad de pista + + + Mute Indicator + Indicador de silencio + + + Solo Indicator + Indicador de solo + + + Track Type + Tipo de pista + + + Track Name + Nombre de pista + + + Output Channel Number + Nmero de canal de salida + + + Output Port + Puerto de salida + + + Time Lock + Bloqueo de tiempo + + + Solo/Pre Fader Listening + Escucha de S�o/pre-fader + + + Name of the midi device associated with this port number + Nombre del dispositivo MIDI asociado con este nmero de puerto + + + + QPopupMenu + + Add Midi Generator... + + + + Add Soft Synth... + + + + + QWidget + + Cannot transform non empty track + No puedo transformar una pista que no est�vacia + + + Velocity + Velocidad + + + Cannot convert sysex string + No puedo convertir el paquete de sistema exclusivo + + + Hex String too long (2048 bytes limit) + Cadena hexadecimal demasiado larga (l�ite de 2048 bytes) + + + generic midi + midi gen�ico + + + new + nuevo + + + create peakfile for + crear archivo de picos para + + + MusE: get file name + MusE: obtener el nombre de archivo + + + the directory + + el directorio + + + + +does not exist +create? + +no existe + Lo creo ? + + + &Create + &Crear + + + Cancel + Cancelar + + + MusE: create directory + MusE: crear directorio + + + creating dir failed + fall�la creaci� de directorio + + + File + + El archivo + + + + +exists + +existe + + + MusE: write + MusE: escribe + + + Overwrite + Sobre escribe + + + Quit + Salir + + + Open File + + Abrir archivo + + + +failed: + +fall� + + + MusE: Open File + MusE: Abrir archivo + + + None + Ninguno + + + Master + Maestro + + + Input + Entrada + + + Group %c + Grupo %c + + + Unknown + Desconocido + + + + QuantConfig + + Config Quantize + Configurar Cuantizaci� + + + Strength + Fuerza + + + Don´t Quantize + No cuantizes + + + Quant Len + Cuantizar la longitud + + + MusE: Config Quantize + MusE: Configurar Cuantizaci� + + + + QuantDialog + + Display Quantize + Mostrar la cuantizaci� + + + Position + Posici� + + + Note Quantize + Cuantizar Nota + + + Rest Quantize + Cuantizar el resto + + + Ok + Aceptar + + + Cancel + Cancelar + + + + RhythmBase + + MusE: Random Rhythm Generator + MusE: Generador de r�mo aleatorio + + + Instrument Properties + Propiedades del instrumento + + + counts/bar + cuentar por barra + + + steps/count + pasos por cuenta + + + # bars + n barras + + + test + probar + + + contrib + contribuir + + + randomize + aleartorizar + + + Group 1 + Grupo 1 + + + Group 2 + Grupo 2 + + + Group 3 + Grupo 3 + + + Group 4 + Grupo 4 + + + Group 5 + Grupo 5 + + + listen + escuchar + + + Instrument + Instrumento + + + Group + Grupo + + + &New + &Nuevo + + + create new entry + crear nueva entrada + + + pressing the New button you create a new entry +in the MusE list of defined controllers + pulsando el bot� Nuevo creas una entrada nueva +en la lista de controles definidos por MusE + + + &Delete + &Borrar + + + delete selected entry + borra la entrada seleccionada + + + Up + Arriba + + + Down + Abajo + + + Instrument + Instrumento + + + steps/count + pasos por cuenta + + + list of defined controllers + Lista de controladores definidos + + + This is the MusE list of defined controllers. + Esta es la lista de controladores definidos en MusE. + + + &File + &Archivo + + + &Edit + &Editar + + + &Help + A&yuda + + + Tools + Herramientas + + + New + Nuevo + + + Open + Abrir + + + &Open... + &Abrir... + + + Save + Guardar + + + &Save + &Guardar + + + Save As + Guardar como + + + Save &As... + Guardar &Como... + + + Print + Imprimir + + + &Print... + &Imprimir... + + + Exit + Salir + + + E&xit + &Salir + + + Undo + Deshacer + + + &Undo + &Deshacer + + + Redo + Rehacer + + + &Redo + &Rehacer + + + Cut + Cortar + + + &Cut + &Cortar + + + Copy + Copiar + + + C&opy + C&opiar + + + Paste + Pegar + + + &Paste + &Pegar + + + Find + Buscar + + + &Find... + &Buscar... + + + Contents + Contenidos + + + &Contents... + &Contenidos... + + + Index + �dice + + + &Index... + &Indice... + + + About + Acerca de + + + &About... + &Acerca de ... + + + + RhythmGenerator + + Form3 + Formulario3 + + + Instrument Settings: + Configuraci� de instrumento: + + + Instrument + Instrumento + + + Hi-Hat + Charli + + + add + a�dir + + + delete + borrar + + + steps/count + pasos/cuenta + + + count/bar + cuentas/comp� + + + # bars + n compases + + + Group Settings: + Configuraci� de grupo: + + + Group + Grupo + + + Group 1 + Grupo 1 + + + Group 2 + Grupo 2 + + + Group 3 + Grupo 3 + + + Group 4 + Grupo 4 + + + Group 5 + Grupo 5 + + + contrib + contrib + + + listen + escuchar + + + Randomize + aleatorizar + + + Rhythm Style: + Estilo de ritmo: + + + Clear + L�pio + + + Open... + Abrir... + + + Save + Guardar + + + Save as... + Guardar como... + + + Generate + Generar + + + Close + Cerrar + + + + RouteDialogBase + + MusE: Routing + + + + Add Route + + + + Source: + + + + Destination: + + + + Connect + + + + connect source to destination + + + + Current Routes + + + + Source + + + + Destination + + + + Remove + + + + remove selected route + + + + + SS_PluginChooserBase + + SimpleDrums - Ladspa Plugin Chooser + + + + Name + Nombre + + + Label + + + + Inports + + + + Outports + + + + Creator + + + + &Cancel + &Cancelar + + + Alt+C + + + + &OK + + + + Alt+O + + + + + Score + + &Config + &Configuraci� + + + Page Settings + Configuraci� de p�ina + + + Staff Settings + Configuraci� de pentagrama + + + Background Pixmap + imagen de fondo + + + Palettes + Paletas + + + Dynamics + Din�icos + + + Print + Imprimir + + + Preview Print + Previsualizar la impresi� + + + Lyrics + Letra + + + enter lyrics + escribe la letra + + + Text + Texto + + + enter text + escribe el texto + + + C7m + C7m + + + enter chord symbol + escribe el s�bolo del acorde + + + to previous voice + al timbre anterior + + + to next voice + al timbre siguiente + + + flip stem direction + intercambia la direcci� de la armadura + + + move marked notes to previous voice or to upper stave in a split system + mueve las notas marcadas al timbre anterior o a la parte superior en sistemas partidos + + + move marked notes to next voice or to lower stave in a split system + mueve las notas marcadas al timbre siguiente o a la parte inferior en sistemas partidos + + + flip stem direction of selected notes + intercambia la direcci� de la armadura de las notas seleccionadas + + + StaffSettings + Configuraci� de pentagrama + + + MusE: config wallpaper + MusE: Configurar imagen de fondo + + + Score + Partitura + + + + ScoreConfig + + Staff Settings: + Configuraci� de Pentagrama: + + + Track List + Lista de pistas + + + Key/Clef + Clave + + + Raster + Raster + + + Note Quantize + Cuantizaci� de nota + + + Rest Quantize + Restaurar cuantizaci� + + + Mode + Modo + + + Split System + Sistema partido + + + Splitpoint + punto de separaci� + + + Ok + Aceptar + + + Apply + Aplicar + + + Cancel + Cancelar + + + Upper Staff + Pentagrama superior + + + Lower Staff + Pentagrama inferior + + + + ScrollScale + + next page + p�ina siguiente + + + previous page + p�ina anterior + + + current page number + numero de p�ina actual + + + + ShortcutCaptureDialogBase + + OK + Aceptar + + + Cancel + Cancelar + + + Enter shortcut sequence + + + + Press keys to enter shortcut sequence! + + + + Old shortcut: + + + + Undefined + + + + New shortcut: + + + + + ShortcutConfig + + Global + + + + Arranger + Arreglador + + + Pianoroll + + + + Drumeditor + + + + List editor + + + + List Mastertrack + + + + All categories + + + + Transport: Start playback from current location + + + + Transport: Toggle metronome + + + + Transport: Stop Playback + + + + Transport: Play, Stop, Rewind + + + + Transport: Goto left marker + + + + Transport: Goto right marker + + + + Transport: Toggle Loop section + + + + Transport: Toggle Record + + + + Edit: Copy + + + + Edit: Undo + + + + Edit: Redo + + + + Edit: Cut + + + + Edit: Paste, + + + + Edit: Delete + + + + File: New project + + + + File: Open from disk + + + + File: Save project + + + + File: Open recent file + + + + File: Save as + + + + File: Load template + + + + File: Import midi file + + + + File: Export midi file + + + + File: Import audio file + + + + File: Quit MusE + + + + Edit: Select parts on track + + + + Open pianoroll + + + + Open drumeditor + + + + Open listeditor + + + + Open graphical mastertrack editor + + + + Open list mastertrack editor + + + + Open midi transformer + + + + Add midi track + + + + Add drum track + + + + Add wave track + + + + Add audio output + + + + Add audio group + + + + Add audio input + + + + Add audio aux + + + + Structure: Global cut + + + + Structure: Global insert + + + + Structure: Global split + + + + Structure: Copy range + + + + Structure: Cut events + + + + View: Open mixer window + + + + View: Toggle transport window + + + + View: Toggle bigtime window + + + + View: Open marker window + + + + Settings: Follow song by page + + + + Settings: Follow song off + + + + Settings: Follow song continuous + + + + Settings: Global configuration + + + + Settings: Configure shortcuts + + + + Settings: Configure metronome + + + + Settings: Midi sync configuration + + + + Settings: Midi file export configuration + + + + Settings: Appearance settings + + + + Settings: Midi ports / Soft Synth + + + + Settings: Audio subsystem configuration + + + + Midi: Edit midi instruments + + + + Midi: Open midi input transform + + + + Midi: Open midi input filter + + + + Midi: Midi input transpose + + + + Midi: Midi remote control + + + + Midi: Random rhythm generator + + + + Midi: Reset midi + + + + Midi: Init midi + + + + Midi: Midi local off + + + + Audio: Bounce audio to track + + + + Audio: Bounce audio to file + + + + Audio: Restart audio + + + + Automation: Mixer automation + + + + Automation: Take mixer snapshot + + + + Automation: Clear mixer automation + + + + Help: Open Manual + + + + Help: Toggle whatsthis mode + + + + Edit: Edit selected part + + + + Edit: Select nearest part on track above + + + + Edit: Add nearest part on track above + + + + Edit: Select nearest part on track below + + + + Edit: Add nearest part on track below + + + + Midi: Transpose + + + + Edit: Select all + + + + Edit: Select none + + + + Edit: Invert selection + + + + Edit: Select events/parts inside locators + + + + Edit: Select events/parts outside locators + + + + Edit: Select nearest part/event to the left + + + + Edit: Add nearest part/event to the left to selection + + + + Edit: Add nearest part/event to the right to selection + + + + Edit: Set locators to selection + + + + Edit: Increase pitch + + + + Edit: Decrease pitch + + + + Edit: Set fixed length on midi events + + + + Quantize: Over Quantize + + + + Quantize: Note On Quantize + + + + Quantize: Note On/Off Quantize + + + + Quantize: Iterative Quantize + + + + Quantize: Configure quant + + + + Quantize: Modify Gate Time + + + + Quantize: Modify Velocity + + + + Edit: Crescendo + + + + Edit: Thin Out + + + + Edit: Erase Event + + + + Edit: Note Shift + + + + Edit: Move Clock + + + + Edit: Copy Measure + + + + Edit: Erase Measure + + + + Edit: Delete Measure + + + + Edit: Create Measure + + + + Edit: Change event color + + + + Tool: Pointer + + + + Tool: Pencil + + + + Tool: Eraser + + + + Tool: Line Draw + + + + Tool: Scissor + + + + Tool: Glue + + + + Tool: Mute + + + + Transport: Increase current position + + + + Transport: Decrease current position + + + + Quantize: Set quantize to 1/1 note + + + + Quantize: Set quantize to 1/2 note + + + + Quantize: Set quantize to 1/4 note + + + + Quantize: Set quantize to 1/8 note + + + + Quantize: Set quantize to 1/16 note + + + + Quantize: Set quantize to 1/32 note + + + + Quantize: Set quantize to 1/64 note + + + + Quantize: Toggle triol quantization + + + + Quantize: Toggle punctuation quantization + + + + Quantize: Toggle punctuation quantization (2) + + + + Edit: Insert at location + + + + Insert Note + Insertar nota + + + Insert SysEx + Insertar sistema exclusivo + + + Insert Ctrl + Insertar controlador + + + Insert Meta + Insertar Meta + + + Insert Channel Aftertouch + Insertar AfterTouch de canal + + + Insert Key Aftertouch + Insertar AfterTouch de tecla + + + Edit: Increase event position + + + + Edit: Decrease event position + + + + Insert Tempo + + + + Insert Signature + + + + Change Event Position + + + + Edit Event Value + + + + + ShortcutConfigBase + + &Apply + &Aplicar + + + Configure Keyboard Shortcuts + + + + Shortcut Category + + + + Description + + + + Shortcut + + + + &Clear + + + + Alt+C + + + + &Define + + + + Alt+D + + + + Alt+A + + + + + SigScale + + signature scale + Armadura de la escala + + + + SimpleDrumsGuiBase + + DrumSynth 0.1 + + + + + StkGuiBase + + MyDialog2 + MiDialogo2 + + + Voices + Voces + + + Edit + Editar + + + + SynthConfigBase + + MusE: Soft Synth Configuration + MusE: Configuraci� del Sintetizador virtual + + + Soft Synthesizer + Sintetizador Virtual + + + File + Archivo + + + Instances + Copias + + + Name + Nombre + + + list of available software synthesizers + lista de sintetizadores de software dispoibles + + + Add Instance + A�dir copia + + + Alsa Port + Puerto ALSA + + + Remove Instance + Quitar copia + + + + TList + + Midi + MIDI + + + Drum + Percusi� + + + Wave + Audio + + + Delete Track + Borrar pista + + + Track Comment + Comentario de pista + + + Show Gui + Mostrar GUI + + + Add Midi Track + A�dir pista MIDI + + + Add Drum Track + A�dir pista de percusi� + + + Add Wave Track + A�dir pista de audio + + + + TempoSig + + Tempo/Sig + tempo/firma + + + + Toolbar1 + + Solo + Solo + + + Snap + Snap + + + Quantize + Cuantizar + + + To + A + + + All Events + Todos los eventos + + + Looped Ev. + Eventos del bucle + + + Selected Ev. + Eventos seleccionados + + + Looped+Sel. + Bucle + Selecci� + + + Cursor + Cursor + + + + TrackComment + + MusE: Track Comment + MusE: Comentario de la pista + + + Track Comment: + Comentario de la pista: + + + + Transport + + Punch In + Pinchar + + + Loop + Bucle + + + Punch Out + Fin pinchado + + + Left Mark + Marca izquierda + + + Right Mark + Marca derecha + + + Overdub + A�dir + + + Replace + Reemplazar + + + Rec Mode + Modo de grabaci� + + + Normal + Normal + + + Mix + Mezcla + + + Cycle Rec + Ciclar Grabaci� + + + punchin + pinchar + + + loop + bucle + + + punchout + fin pinchado + + + rewind to start + retroceder al inicio + + + rewind + retroceder + + + forward + avanzar + + + stop + parar + + + play + reproducir + + + record + grabar + + + AC + AC + + + quantize during record + cuantizar durante la grabaci� + + + Click + Click + + + metronom click on/off + Click del metr�omo encendido/apagado + + + Sync + Sinconizaci� + + + external sync on/off + Sincronizaci� externa encedida/apagada + + + Master + Maestro + + + use master track + usar pista maestra + + + + TransposeDialogBase + + MusE: Midi Transpose + MusE: Transposici� MIDI + + + Value + Valor + + + halftones + semitonos + + + Time + Tiempo + + + all + todo + + + between markers + entre marcadores + + + Parts + Partes + + + all in selected tracks + todo en las pistas seleccionadas + + + OK + Aceptar + + + Cancel + Cancelar + + + + VAMGuiBase + + Virtual Analogue for MusE + Analogico virtual para MusE + + + LFO + LFO + + + Freq + Freq + + + Waveform + Tipo Onda + + + Sine + Seno + + + Pulse + Pulso + + + Saw + Sierra + + + Triangle + Tri�gulo + + + Filter + Filtro + + + EnvMod + Modulaci� de envolvente + + + Attack + Ataque + + + Decay + Decaimiento + + + Sustain + Sostenido + + + Release + Relajaci� + + + Cutoff + Frecuencia de corte + + + Resonance + Resonancia + + + Invert + Invertir + + + KeyTrack + Seguir teclas + + + Presets + Plantillas + + + Set + Establecer + + + load preset list + cargar lista de plantillas + + + save preset list + guardar lista de plantillas + + + save preset list to a new file + guardar lista de plantillas en un archivo nuevo + + + delete preset + borrar plantilla + + + DCO 1 + DCO 1 + + + Pitch + Tono + + + Detune + Desafinaci� + + + PWM + PWM + + + FM + FM + + + PW + PW + + + DCO 2 + DCO 2 + + + On + Encendido + + + VAM 1.0beta2 +Virtual Analog for MusE +Released under GPL. +Copyright(C) 2002 +Jotsif Lindman Hörnlund +( jotsif@linux.nu ) + VAM 1.0beta2 +Virtual Analog for MusE +Released under GPL. +Copyright(C) 2002 +Jotsif Lindman Hörnlund +( jotsif@linux.nu ) + + + + VelocityBase + + MusE: Modify Velocity + MusE: Modificar velocidad + + + Range + Rango + + + All Events + Todos los eventos + + + Selected Events + Eventos seleccionados + + + Looped Events + Eventos del bucle + + + Selected & Looped + Seleccionados y bucle + + + Values + Valores + + + Rate: + Velocidad: + + + Offset: + Desplazamiento: + + + % + % + + + OK + Aceptar + + + Cancel + Cancelar + + + + WTScale + + bar scale + escala de compases + + + + WaveEdit + + Normalize + Normalizar + + + weTools + Herramientas de Audio + + + Solo + Solo + + + Cursor + Cursor + + + &File + &Archivo + + + Functions + Funciones + + + + WaveTrackInfoBase + + MusE: TrackInfo + MusE: Informaci� de pista + + + Track Info + Informaci� de pista + + + Track Name + Nombre de pista + + + Output Route: + Ruta de salida: + + + Input Route: + Ruta de netrada: + + + Ports: + Puertos: + + + Mono + Mono + + + Stereo + Est�eo + + + off + apagado + + + Track Delay (ticks) + + + + Delay + + + + Delay (Frames) + + + + diff --git a/muse/share/locale/muse_fr.qm b/muse/share/locale/muse_fr.qm new file mode 100644 index 00000000..72c396c1 Binary files /dev/null and b/muse/share/locale/muse_fr.qm 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 @@ + + + + + Click this button to enable recording + Cliquez sur ce bouton pour activer l'enregistrement + + + sets amount of quantization: +0 - no quantization +100 - full quantization + Définit le niveau de quantisation: +0 - pas de quantisation +100 - quantisation complète + + + select Pointer Tool: +with the pointer tool you can: + select parts + move parts + copy parts + Choisir l'Outil de Pointage: +avec l'outil de pointage vous pouvez: + choisir des pièces + déplacer des pièces + copier des pièces + + + Insert Note + Insérer Note + + + Insert SysEx + Insérer SysEx + + + Insert Ctrl + Insérer Ctrl + + + Insert Meta + Insérer Meta + + + Insert Channel Aftertouch + Insérr Canal de Pression + + + Insert Key Aftertouch + Insérer une note de Pression + + + + @default + + Click this button to open a <em>new song</em>.<br>You can also select the <b>Open command</b> from the File menu. + Cliquez sur ce bouton pour ouvrir une <em>nouvelle chansong</em>.<br>Vous pouvez aussi sélectionner la <b>commande Ouvrir</b> à partir du menu Fichier. + + + 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. + 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. + + + Create New Song + Créer une nouvelle chanson + + + Click this button to stop playback + Cliquez sur ce bouton pour arréter la lecture + + + Click this button to start playback + Cliquez sur ce bouton pour démarrer la lecture + + + Click this button to rewind to start position + Cliquez sur ce bouton pour revenir à la position de départ + + + Click this button to rewind + Cliquez sur ce bouton pour revenir en arrière + + + Click this button to forward current play position + Cliquez sur ce bouton pour avancer dans la lecture + + + don't quantize notes above this tick limit + Ne pas quantiser les notes sur cette limite (en tick) + + + quantize also note len as default + quantiser aussi la longueur de note par défault + + + loop between left mark and right mark + Boucler entre les marqueurs gauche et droit + + + record starts at left mark + l'enregistrement démarre au marqueur gauche + + + record stops at right mark + l'enregistrement s'arrète au marqueur droit + + + rewind to start position + revenir à la position de départ + + + rewind current position + revenir à la position en cours + + + move current position + déplacer la position en cours + + + stop sequencer + arréter le séquenceur + + + start sequencer play + démarrer la lecture du séquenceur + + + to record press record and then play + pour enregistrer, presser Enregistrement (Record) puis Lecture (Play) + + + send note off to all midi channels + envoyer ordre de relachement de note à tous les canaux midi + + + select Pencil Tool: +with the pencil tool you can: + create new parts + modify length of parts + Choisir l'Outil Crayon +avec le crayon vous pouvez: + créer de nouvelles pièces + modifier la longueur des pièces + + + select Delete Tool: +with the delete tool you can delete parts + choisir l'Outil Gomme: +avec la gomme vous pouvez effacer les pièces + + + select Cut Tool: +with the cut tool you can split a part + Choisir l'Outil Ciseaux +avec les ciseaux vous pouver couper une pièce + + + select Glue Tool: +with the glue tool you can glue two parts + Choisir l'Outil Colle: +avec la colle vous pouvez coller deux pièces ensemble + + + select Score Tool: + + Choisir l'Outil Partition + + + select Quantize Tool: +insert display quantize event + Choisir l'Outil Quantisation: +pour voir les marques de quantisation + + + select Drawing Tool + Choisir l'Outil de Dessin + + + select Muting Tool: +click on part to mute/unmute + Choisir l'Outil Silence: +cliquez sur une pièces pour la rendre muette ou pas. + + + pointer + pointeur + + + pencil + crayon + + + rubber + élastique + + + cutter + ciseaux + + + score + partition + + + glue + colle + + + quantize + quantisation + + + draw + dessin + + + mute parts + silence + + + Off + Arrt + + + presets (*.pre *.pre.gz *.pre.bz2) + réglages (presets: *.pre *.pre.gz *.pre.bz2) + + + All Files (*) + Tous les Fichiers + + + Add Midi Track + + + + Add Wave Track + + + + Add Audio Output + + + + Add Audio Group + + + + Add Audio Input + + + + Add Aux Send + + + + Click this button to enable recording + Cliquez sur ce bouton pour activer l'enregistrement + + + Midi Strips + + + + Add Midi Output Port + + + + Add Midi Input Port + + + + Audio Strips + + + + + AboutBox + + AboutBox + + + + Keep On Rocking! + + + + 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 + + + + + Appearance + + MusE: load image + MusE: charger une image + + + handle of transport window + Accroche de la fenêtre Transport + + + track activity in arranger + Activité des pistes dans l'Arrangeur + + + bigtime font color + Couleur de la police dans le GrandChrono + + + bigtime background color + Couleur de fond du GrandChrono + + + waveedit background color + Couleur du fond de l'éditeur d'échantillon + + + + AppearanceDialogBase + + MusE: Appearance settings + MusE: réglages de l'apparence + + + Apply + Appliquer + + + Ok + Ok + + + Cancel + Annuler + + + Arranger + Arrangeur + + + Parts + Pièces + + + show frames + montrer les séparations + + + show names + montrer les noms + + + show events + montrer les évènements + + + show Cakewalk Style + montrer dans le style Cakewalk + + + Events + Evènement + + + note on + note on + + + poly pressure + pression poly + + + controller + contrleurs + + + aftertouch + pression (aftertouch) + + + pitch bend + molette de hauteur (pitch) + + + program change + sélection de programme (prog. change) + + + special + spécial + + + Background picture + image de fond + + + bg + fond + + + select... + choisissez... + + + show snap grid + voir la grille de positionnement + + + Colors + couleurs + + + Items + Objets + + + selected + sélectionné + + + current: + en cours: + + + change... + changer... + + + dynamic colors for track activity in arranger + Choix auto des couleurs pour l'activité des pistes dans l'Arrangeur + + + Style/Fonts + Styles/Polices + + + QT Theme + Thème + + + Windows + Windows + + + MusE + MusE + + + Metal + Metal + + + Norwegian Wood + Norwegian Wood + + + Platinum + Platinum + + + CDE + CDE + + + Motif + Motif + + + Motif Plus + Motif Plus + + + Fonts + Polices + + + Family + Famille + + + Size + Taille + + + Font 1 + Police 1 + + + Font 2 + Police 2 + + + Font 3 + Police 3 + + + Font 0 + Police 0 + + + Bold + Gras + + + Italic + Italique + + + ... + ... + + + Font 4 + Police 4 + + + Font 5 + Police 5 + + + Palette + + + + add to palette + + + + B + + + + S + S + + + H + + + + V + + + + G + + + + R + R + + + Itemdsfkajlk jölk ljfölajföajföajf + + + + + Arranger + + Cursor + Curseur + + + Snap + Aligne + + + Len + Longueur + + + Type + Type + + + NO + NON + + + midi song type + type de fichier midi + + + Pitch + Hauteur + + + midi pitch + hauteur midi + + + global midi pitch shift + transposition midi globale + + + Tempo + Tempo + + + midi tempo + tempo midi + + + TrackInfo + InfoPiste + + + Track + Piste + + + O-Port + 0-Port + + + Arranger + Arrangeur + + + Off + Arrt + + + Bar + Mesure + + + GM + GM + + + GS + GS + + + XG + XG + + + N + N + + + R + R + + + A + A + + + M + M + + + S + S + + + C + C + + + Ch + Ch + + + T + T + + + Master + Matre + + + Group A + Groupe A + + + Group B + Groupe B + + + Group C + Groupe C + + + Group D + Groupe D + + + + AudioConfBase + + MusE: Audio Configuration + MusE: Configuration Audio + + + &Apply + &Appliquer + + + &OK + &OK + + + &Cancel + A&nnuler + + + Audio Parameters + Paramètres Audio + + + 32 + 32 + + + 64 + 64 + + + 128 + 128 + + + 256 + 256 + + + 512 + 512 + + + 1024 + 1024 + + + 2048 + 2048 + + + 4096 + 4096 + + + Frame Size: + Longueur des frames: + + + Delay: + Délai: + + + Sample Rate: + Vitesse d'échantillonage: + + + 44100 + 44100 + + + 48000 + 48000 + + + 96000 + 96000 + + + Audio Driver + Pilote Audio + + + Use Alsa + Alsa + + + Use JACK + JACK + + + No Audio + Pas d'audio + + + Status: + Etat: + + + TextLabel6 + TextLabel6 + + + + AudioMixerApp + + 1/2 channel + 1/2 canal + + + pre fader - post fader + pre fader - post fader + + + record + enregistrement + + + mute + silence + + + pre fader listening + écoute pre fader + + + record downmix + enregistrer mixdown + + + off + arr + + + output routing + chemin de sortie (routing) + + + &Config + &Configuration + + + Add Input Strip + Ajouter une Bande d'Entrée + + + S + S + + + Pre + Pre + + + dB + dB + + + MusE: Audio Mixer + MusE: Mixer Audio + + + Inputs + Entrées + + + Synthi + Synth + + + Tracks + Pistes + + + Groups + Groupes + + + Master + Matre + + + Group A + Groupe A + + + Group B + Groupe B + + + Group C + Groupe C + + + Group D + Groupe D + + + None + Aucun + + + + AudioStrip + + Pan + Pan + + + S + S + + + 1/2 channel + 1/2 canal + + + Pre + Pre + + + pre fader - post fader + pre fader - post fader + + + dB + dB + + + mute + silence + + + record downmix + enregistrer mixdown + + + pre fader listening + écoute pre fader + + + output routing + chemin de sortie (routing) + + + Channel + Canal + + + + BigTime + + MusE: Bigtime + MusE: GrandChrono + + + + ClipListEdit + + MusE: Clip List Editor + MusE: Editeur de la Liste de Clips + + + + ClipListEditorBase + + MusE: ClipList + MusE: Liste de Clips + + + Name + Nom + + + Refs + Réfs + + + Start + Départ + + + Len + Long + + + Data + Données + + + Clip Properties + Propriétés du Clip + + + Pos: + Pos: + + + Len: + Long: + + + + CommentBase + + Form1 + Forme1 + + + Track Comment + Commentaire pour la Piste + + + Track 1 + Piste 1 + + + + ConfigMidiCtrlBase + + MusE: Config Midi Controller + + + + Midi Port: + + + + Available Controller: + + + + Add + + + + Remove + + + + Automated Controller: + + + + &OK + + + + &Cancel + + + + + ConfigMidiFileBase + + MusE: Config Midi File Export + + + + &OK + + + + &Cancel + + + + 0 (single track) + + + + 1 (multiple tracks) + + + + Format: + + + + 96 + 96 + + + 192 + 192 + + + 384 + 384 + + + Division: + + + + Copyright: + + + + Enable extended smf format + Activer la prise en charge du format smf étendu + + + + ConfigTrackListBase + + MusE: Config Track List + + + + Track Type: + + + + Audio Output + + + + Audio Group + + + + Audio Aux + + + + Wave Track + + + + Audio Input + + + + Soft Synthesizer + Synthétiseur virtuel + + + Midi Track + + + + Drum Track + + + + Available Items: + + + + Add + + + + Remove + + + + Up + + + + Down + + + + Configured Items + + + + Track Name Size: + + + + &OK + + + + &Cancel + + + + + CtrlPanel + + select controller + Choisissez le contrlleur + + + remove panel + enlever le panneau + + + other ... + autres... + + + Sel + Sél + + + x + x + + + Velocity + Vélocité + + + Pitch + Hauteur + + + + DeicsOnzeGuiBase + + DeicsOnze + + + + &Presets + + + + LBA + + + + Subcategory + + + + PRO + + + + Preset + Réglages enregistrés + + + Bank numerous + + + + NONE + + + + Program numerous + + + + INITVOICE + + + + DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence + + + + HBA + + + + Category + + + + &Global + + + + Op4 Feedback + + + + Feedback level of the operator 4 + + + + Master Volume + + + + Master volume + + + + Modulation Matrix + + + + <b>Algorithm 1</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 2</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by both <i>Op 3</i> and <i>Op 4</i><br> +<b>Algorithm 3</b> : <i>Op 1</i> modulated by both <i>Op 4</i> and <i>Op 2</i> modulated by <i>Op 3</i><br> +<b>Algorithm 4</b> : <i>Op 1</i> modulated by both <i>Op 2</i> and <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 5</b> : (<i>Op 1</i> modulated by <i>Op 2</i>) add to (<i>Op 3</i> modulated by <i>Op 4</i>) <br> +<b>Algorithm 6</b> : addition of the three <i>Op 1, 2, 3</i> all modulated by <i>Op 4</i><br> +<b>Algorithm 7</b> : addition of the three <i>Op 1, 2, 3</i> with <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 8</b> : addition of the four <i>Op 1, 2, 3, 4</i> + + + + LFO + + + + LFO Sync + + + + Pitch modulation sensitivity + + + + Pitch Modulation Sensitivity + + + + LFO Delay + + + + LFO delay + + + + LFO speed + + + + Amplitude modulation depth + + + + Pitch modulation depth + + + + Amplitude modulation sensitivity + + + + Amplitude Modulation Sensitivity + + + + AMS + + + + LFO Waveform + + + + Pitch Modulation Depth + + + + PMD + + + + LFO Speed + + + + AMD + + + + Speed + Vitesse + + + Delay + + + + PMS + + + + Pitch Envelope + + + + PL3 + + + + PL2 + + + + PL1 + + + + PR1 + + + + PR2 + + + + PR3 + + + + Op &1 + + + + OUT 1 + + + + Output Volume + + + + Volume + Volume + + + Frequency 1 + + + + Coarse 1 + + + + Coarse Ratio + + + + Fine 1 + + + + Fine Ratio + + + + Freq 1 + + + + Fixed Frequency + + + + FIX + + + + Toggle Fix Frequency + + + + Sensitivity 1 + + + + KVS1 + + + + AME1 + + + + Amplitude Modulation Enable + + + + Keyboard Velocity Sensitivity + + + + Key Velocity Sensitivity + + + + EBS1 + + + + EG Bias Sensitivity + + + + Eg Bias Sensitivity + + + + Detune, OSCWave, EGShift 1 + + + + DET1 + + + + Detune + + + + Attack Rate of the operator 1 + + + + 96dB + + + + 48dB + + + + 24dB + + + + 12dB + + + + EG Shift + + + + Wave form + + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + Amplitude Envelope 1 + + + + RR1 + + + + D1R1 + + + + D1L1 + + + + D2R1 + + + + Release Rate + + + + 2° Decay Rate + + + + 1° Decay Level + + + + 1° Decay Rate + + + + Attack Rate + + + + AR1 + + + + Scaling 1 + + + + LS1 + + + + RS1 + + + + Rate Scaling + + + + Level Scaling + + + + Op &2 + + + + Sensitivity 2 + + + + EBS2 + + + + KVS2 + + + + AME2 + + + + Detune, OSCWave, EGShift 2 + + + + DET2 + + + + OUT 2 + + + + Scaling 2 + + + + LS2 + + + + RS2 + + + + Frequency 2 + + + + Coarse 2 + + + + Fine 2 + + + + Freq 2 + + + + Amplitude Envelope 2 + + + + D1R2 + + + + D1L2 + + + + D2R2 + + + + RR2 + + + + AR2 + + + + Op &3 + + + + Sensitivity 3 + + + + EBS3 + + + + KVS3 + + + + AME3 + + + + Detune, OSCWave, EGShift 3 + + + + DET3 + + + + Frequency 3 + + + + Coarse 3 + + + + Fine 3 + + + + Freq 3 + + + + OUT 3 + + + + Scaling 3 + + + + LS3 + + + + RS3 + + + + Amplitude Envelope 3 + + + + D1R3 + + + + D1L3 + + + + D2R3 + + + + RR3 + + + + AR3 + + + + Op &4 + + + + Sensitivity 4 + + + + EBS4 + + + + KVS4 + + + + AME4 + + + + Detune, OSCWave, EGShift 4 + + + + DET4 + + + + OUT 4 + + + + Scaling 4 + + + + LS4 + + + + RS4 + + + + Frequency 4 + + + + Coarse 4 + + + + Fine 4 + + + + Freq 4 + + + + amplitude Envelope 4 + + + + AR4 + + + + D1R4 + + + + D1L4 + + + + D2R4 + + + + RR4 + + + + &Fun + + + + Phony Mode + + + + POLY + + + + MONO + + + + Reverb + + + + Foot Control + + + + Pitch Bend Range + + + + Amplitude + + + + Pitch + Hauteur + + + Modulation Wheel + + + + Breath Control + + + + Envelope Bias + + + + Pitch Bias + + + + After Touch + Pression (After Touch) + + + Potamento + + + + FINGER + + + + FULL + + + + Portamento Mode + + + + PT + + + + Portamento Time + + + + Foot Switch + + + + Sustain + + + + Portamento + + + + Transpose + Transposition + + + &Config + &Configuration + + + Configuration File + + + + Save + Enregistrer + + + Load + + + + Quality + + + + High + + + + Middle + + + + Low + + + + NbrV + + + + Number of Voices + + + + Colors + couleurs + + + Red + + + + Green + + + + Blue + + + + Text + Texte + + + Background + + + + Edit Text + + + + Edit Background + + + + Save Mode + + + + Save only the used presets into the project + + + + Save the entire set into the project + + + + Save the configuration into the project + + + + + DrumEdit + + Load Map + Charger + + + Save Map + Enregistrer + + + &Edit + &Editer + + + Cut + Couper + + + Copy + Copier + + + Paste + Coller + + + Delete Events + Effacer + + + Select All + Tout sélectionner + + + Select None + Dé-sélectionner + + + Invert + Inverser + + + Inside Loop + Dans la boucle + + + Outside Loop + Hors de la boucle + + + &Select + &Sélectionner + + + Step Record + Enregistrement pas-à-pas + + + Midi Input + Entrée Midi + + + Add Controller View + Ajouter une Vue de contrlleurs + + + M + M + + + Sound + Son + + + QNT + QNT + + + E-Note + E-Note + + + Len + Long + + + A-Note + A-Note + + + Ch + Ch + + + Port + Port + + + LV1 + LV1 + + + LV2 + LV2 + + + LV3 + LV3 + + + LV4 + LV4 + + + &File + &Fichier + + + Load Drummap + Charger Set de Batterie + + + Store Drummap + Enregistrer Set de Batterie + + + ctrl + ctrl + + + drummaps + Sets de Batterie + + + Muse: Load Drum Map + MusE: Charger Set de Batt. + + + MusE: Store Drum Map + MusE: Enregistrer Set de Batt. + + + &Functions + &Fonctions + + + Modify Velocity + Modifier la vélocité + + + + EditCAfterDialog + + Time Position + Position temporelle + + + Pressure + Pression + + + MusE: Enter Channel Aftertouch + MusE: Entrez le Canal de Pression (AfterTouch) + + + + EditCtrl14Dialog + + Time Position + Position temporelle + + + Controller-H + Contrlleur H + + + Controller-L + Contrlleur L + + + Value + Valeur + + + MusE: Enter Controller14 Event + MusE: Entrer l'évènement Contrlleur 14 + + + + EditCtrl7Dialog + + Time Position + Position temporelle + + + Controller + Contrlleur + + + Value + Valeur + + + MusE: Enter Controller Event + MusE: Entrez l'Evénement Contrlleur + + + + EditCtrl7DialogBase + + MusE: Enter Controller + Muse: Entrez le Contrlleur + + + Controller: + Contrlleur: + + + Time Position: + Position temporelle + + + Value: + Valeur + + + controller value + Valeur du Contrlleur + + + OK + OK + + + Cancel + Annuler + + + + EditCtrlBase + + MusE: Edit Controller Event + + + + Available Controller: + + + + Create New Controller + + + + Value + Valeur + + + Controller + + + + H-Bank + H-Bank + + + L-Bank + L-Bank + + + Program + + + + off + arr + + + &OK + + + + &Cancel + + + + Midi Port: + + + + Midi Channel: + + + + Time Position: + + + + Patch Name + + + + + EditEventDialog + + Ok + Ok + + + Cancel + Annuler + + + + EditInstrumentBase + + MusE: Instrument Editor + + + + Patches + + + + Patch Name: + + + + High Bank: + + + + Low Bank: + + + + Program: + + + + d.c. + dont care + + + + d.c. + + + + Patch/Group + + + + &Delete + + + + Alt+D + + + + &New Patch + + + + Alt+N + + + + New Group + + + + Drum + + + + GM + GM + + + GS + GS + + + XG + XG + + + Controller + + + + Predefined Controller: + + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Properties + + + + Name + Nom + + + Type + Type + + + Control7 + + + + Control14 + + + + RPN + RPN + + + NRPN + NRPN + + + Pitch + Hauteur + + + Program + + + + H-Ctrl + + + + Midi Controller Number High Byte + + + + L-Ctrl + + + + Midi Controller Number Low Byte + + + + Range + Entre + + + Min + + + + Max + + + + Default + + + + Name + + + + Type + + + + Min Val + + + + Max Val + + + + list of defined controllers + list des controleurs définis + + + This is the MusE list of defined controllers. + C'est la liste des controleurs qui ont été définis + + + SysEx + SysEx + + + Initialization + + + + Panic + Panique! + + + Hex Entry: + + + + &File + &Fichier + + + Tools + + + + New + + + + &New + &Nouveau + + + Ctrl+N + + + + Open + + + + &Open... + + + + Ctrl+O + + + + Save + Enregistrer + + + &Save + &Enregistrer + + + Ctrl+S + + + + Save As + + + + Save &As... + + + + Exit + + + + E&xit + + + + + EditMetaDialog + + Time Position + Position temporelle + + + Meta Type + Meta Type + + + Enter Hex + Entrez en Hexa + + + MusE: Enter Meta Event + MusE: Entrer un Evènement en Hexa + + + + EditMetaDialogBase + + MusE: Enter Meta Event + MusE: Entrer un Méta Evènement + + + OK + OK + + + Cancel + Annuler + + + TextLabel1 + TextLabel1 + + + Time Position: + Position temporelle + + + Meta Type: + Meta Type + + + Enter Hex + Entrée Hexa + + + + EditNoteDialogBase + + MusE: Enter Note + Mus2: Entrer la Note + + + OK + OK + + + Cancel + ANnuler + + + Length: + Longueur: + + + Time Position: + Position temporelle: + + + Pitch: + Hauteur + + + Velocity On: + Vélocité On: + + + Velocity Off: + Vélocité Off: + + + + EditPAfterDialog + + Time Position + Position temporelle + + + Pitch + Hauteur + + + Pressure + Pression + + + MusE: Enter Poly Aftertouch + Muse: Entrer la Pression polyph. + + + + EditPitchDialog + + Time Position + Editer la Position temporelle + + + Pitch + Hauteur + + + MusE: Enter Pitch Shift + MusE: Entrez le décalage de Hauteur: + + + + EditSysexDialogBase + + MusE: Enter SysEx + MusE: Entrer le Sysex + + + TimePosition: + Position temporelle + + + Comment: + Commentaires: + + + OK + OK + + + Cancel + Annuler + + + Known SysEx: + + + + Add + + + + + EditToolBar + + Edit Tools + Outils d'Edition + + + + EffectRack + + effect rack + rack d'effets + + + move up + Déplacer vers le haut + + + move down + Déplacer vers le bas + + + remove + enlever + + + bypass + direct + + + show gui + montrer l'interface + + + new + nouveau + + + change + changement + + + + FLUIDGuiBase + + Form1 + Form1 + + + Soundfont + Set de Sons + + + Load + Charger + + + + FLUIDSynthGuiBase + + FLUID Synth + FLUID Synth + + + Gain + Gain + + + Room Size + Dimension de la chambre + + + Damping + Atténuation + + + Level + Niveau + + + Width + Largeur + + + Speed + Vitesse + + + Depth + Profondeur + + + Number + Nombre + + + Type + Type + + + Sine + Sinusoide + + + Triangle + Triangle + + + Reverb + Réverb + + + Chorus + Chorus + + + Pop + Pop + + + Push + Pousser + + + ... + ... + + + show fluidsynth controls + Montrer les contrles de fluidsynth + + + Load + charger + + + Save + Enregistrer + + + Delete + + + + Dump Info + + + + ID + + + + Fontname + + + + Chnl + + + + Soundfont + + + + Drum Chnl + + + + CHANNEL SETUP + + + + LOADED SOUNDFONTS + + + + + FileDialogButtons + + Form1 + Form1 + + + Global + Global + + + User + Utilisateur + + + Project + Projet + + + Load: + + + + Songdata + +Cofiguration + + + + only +Songdata + + + + + FontSel + + Size: + Taille: + + + + GateTimeBase + + MusE: Modify Gate Time + MusE: modifier le temps de fermeture (Gate Time) + + + Range + Entre + + + All Events + Tous les Evènements + + + Selected Events + Evènements choisis + + + Looped Events + Evènements bouclés + + + Selected & Looped + Boucle & sélectionnée + + + Values + Valeurs + + + Rate: + Vitesse: + + + Offset: + Décalage: + + + % + % + + + OK + OK + + + Cancel + Annuler + + + + GlobalSettingsDialogBase + + MusE: Global Settings + MusE: Paramètres + + + Audio + Audio + + + Mixer + Mixer + + + dB + dB + + + min. Meter Value + Métrage min. + + + min.Slider Val + Val. mini. du Curseur + + + Midi + Midi + + + Ticks + Tic + + + 1024 + 1024 + + + 2048 + 2048 + + + 4096 + 4096 + + + 8172 + 8172 + + + Displayed Resolution +(Ticks/Quarternote) + Résolution affichée (Tics par 1/4 de note) + + + 48 + 48 + + + 96 + 96 + + + 192 + 192 + + + 384 + 384 + + + 768 + 768 + + + 1536 + 1536 + + + 3072 + 3072 + + + 6144 + 6144 + + + 12288 + 12288 + + + RTC Resolution +(Ticks/Sec) + Résolution RTC (Tics par sec.) + + + GUI + GUI + + + /sec + /sec + + + GUI Refresh Rate + Vitesse de rafraichissement de l'interface + + + &Apply + &Appliquer + + + &Ok + &Ok + + + &Cancel + &Annuler + + + Help Browser: + Navigateur pour l'aide: + + + Application + + + + Start Muse + + + + start with last song + + + + start with song + + + + start song: + + + + Views + + + + y-pos + + + + show + + + + x-pos + + + + height + + + + width + + + + Big Time + + + + Arranger + Arrangeur + + + Transport + Transport + + + Cur + + + + set current values + + + + start with template: default.med + + + + show splash screen + + + + use JACK freewheel mode if possible + + + + Mixer 1 + + + + Mixer 2 + + + + + LMaster + + new tempo + nouveau tempo + + + new signature + nouvelle signature + + + Meter + Métrage + + + Time + Temps + + + Type + Type + + + Value + Valeur + + + MusE: Mastertrack + MusE: Piste principale + + + Tempo + Tempo + + + Timesig + Signature Temporelle + + + + ListEdit + + &Edit + &Edition + + + Cut + Couper + + + Copy + Copier + + + Paste + Coller + + + Delete Events + Effacer évènements + + + List Tools + Outils de Liste + + + Insert Tools + Outils d'Insertion + + + Insert Note + Insérer Note + + + insert Note + insére une note + + + Insert SysEx + Insérer SysEx + + + insert SysEx + insère une commande midi SysEx + + + Insert Ctrl + Insérer Ctrl + + + insert Ctrl + insére un caractère de Controle + + + Insert Meta + Insérer Meta + + + insert Meta + insére une balise Meta + + + Insert Pitch + Insérer Hauteur + + + insert Pitch + insére un changement de tonalité + + + Insert Channel Aftertouch + Insérr Canal de Pression + + + insert Channel Aftertouch + insére un canal de Pression (AfterTouch) + + + Insert Key Aftertouch + Insérer une note de Pression + + + insert Poly Aftertouch + insère une Pression (AfterTouch) polyphonique + + + Tick + Tic + + + Bar + Mesure + + + Typ + Typ + + + Ch + Can + + + Val A + Val A + + + Val B + Val B + + + Val C + Val C + + + Len + Lon + + + Comment + Comment. + + + + MITTransposeBase + + MusE: Midi Input Plugin: Transpose + MusE: Plugin d'Entrée Midi: Transposition + + + On + On + + + TriggerKey + Note de Déclenchement + + + Transpose: + Transposition: + + + +0 + +0 + + + + MPConfig + + none + aucun + + + other raw ... + autre brut (raw)... + + + MusE: Midi Port Table + MusE: Table des ports Midi + + + Port + Port + + + GUI + GUI + + + Rec + Enr + + + Instrument + Instrument + + + Device Name + Nom du Périphérique + + + State + Etat + + + unknown + inconnu + + + + MRConfigBase + + MusE: Midi Input Plugin: Remote Control + MusE: Plugin d'Entrée Midi: Contrôle Distant + + + Activate + Activer + + + On + On + + + Actions + Actions + + + Stop + Stop + + + Record + Enregistre + + + Goto Left Mark + Aller à la Marque Gauche + + + Play + Jouer + + + + MTScale + + bar scale + Echelle de la mesure + + + + MarkerView + + Bar:Beat:Tick + Mesure:Résolution(Beat):Tic + + + Hr:Mn:Sc:Fr:Sf + Hr:Mn:Sc:Fr:Sf + + + Lock + Verrouillage + + + Text + Texte + + + Marker Properties + Propriétés du Marqueur + + + MusE: Marker + MusE: Marqueur + + + add marker + Ajouter marqueur + + + Add Marker + Ajoute un marqueur + + + delete marker + Effacer Marqueur + + + Delete Marker + Efface le marqueur + + + &File + &Fichier + + + &Edit + &Edition + + + + MasterEdit + + Master + Maitre + + + Cursor + Curseur + + + Snap + Aligne + + + time at cursor position + Temps à la position du curseur + + + tempo at cursor position + Temps à la position du curseur + + + CurPos + PosCur + + + tempo at current position + tempo à la position en cours + + + time signature at current position + Signature temporellet à la position en cours + + + MusE: Mastertrack + MusE: PistePrincipale + + + edit tools + outils d'édition + + + EnableMaster + ActiverMaitre + + + use master track + Utiliser la piste principale + + + Info + Info + + + Off + Off + + + + MetronomeConfigBase + + MusE: Metronome Config + MusE: Configuration du Métronome + + + Metronome + Métronome + + + Audio Beep + Bip audio + + + MIDI Click + Clic MIDI + + + Midi Channel + Canal Midi + + + Measure Note + Note Mesure + + + Measure Velocity + Vélocité de la Mesure + + + Beat Velocity + Résolution (Beat) de la Vélocité + + + Beat Note + Note de Résolution (Beat) + + + Midi Port + Port MIDI + + + Precount + Pré-compte + + + enable + activer + + + Bars + Mesures + + + From Mastertrack + de la Piste Principale + + + / + / + + + Signature + Signature + + + Prerecord + Pré-enregistrement + + + Preroll + PreRoll + + + &Apply + &Appliquer + + + &OK + &Ok + + + &Cancel + &Annuler + + + + MidiController + + Velocity + Vélocité + + + + MidiControllerEditDialog + + MusE: save midi controller list + MusE: enregistrer la liste des controleurs midi + + + MusE: load midi controller list + MusE: charger une liste de controleurs midi + + + + MidiControllerEditDialogBase + + MusE: Define Midi Controller + MusE: Définir un Controleur Midi + + + replace controller set + remplacer le groupe de controleurs + + + merge controller set + ajouter le groupe de controleurs + + + save controller set as + Enregistrer le groupe de controleurs sous... + + + Name + Nom + + + Type + Type + + + H-Ctrl + H-Ctrl + + + L-Ctrl + L-Ctrl + + + Min Val + Val Min + + + Max Val + Val Max + + + list of defined controllers + list des controleurs définis + + + This is the MusE list of defined controllers. + C'est la liste des controleurs qui ont été définis + + + Properties + Propriétés + + + Name + Nom + + + Max Value + Valeur Max + + + Min Value + Valeur Mini + + + Control7 + Control7 + + + Control14 + Control8 + + + RPN + RPN + + + NRPN + NRPN + + + XG-SysEx + XG-SysEx + + + SysEx + SysEx + + + Type + Type + + + &New + &Nouveau + + + create new entry + Crée une nouvelle entrée + + + pressing the New button you create a new entry +in the MusE list of defined controllers + Crée une nouvelle entrée dans la liste des controleurs + + + &Delete + &Effacer + + + delete selected entry + efface l'entrée sélectionnée + + + &OK + &Ok + + + &Cancel + &Annuler + + + &Add + + + + Alt+A + + + + Predefined Controller: + + + + Managed Controller for Port + + + + Channel + Canal + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Pitch + Hauteur + + + Program + + + + Midi Controller Number High Byte + + + + Midi Controller Number Low Byte + + + + Range + Entre + + + + MidiFileConfig + + Enable extended smf format + Activer la prise en charge du format smf étendu + + + Division + Division + + + Copyright + Copyright + + + Config exported Midi Files + Configuration de l'export en fichier Midi + + + MusE: Config exported Midi Files + MusE: Configurer l'export en fichier Midi + + + + MidiFilterConfigBase + + MusE: Midi Input Filter + MusE: Filtre Entrée Midi + + + Record Filter + Filtre d'Enregistrement + + + Note On + Note On + + + Poly Pressure + Pression Poly + + + Controller + Controleur + + + Program Change + Changement de son (Program Change) + + + After Touch + Pression (After Touch) + + + Pitch Bend + Molette de modulation - Hauteur + + + Sysex + SysEx + + + Thru Filter + Filtre Thru + + + Controller Filter + Filtre Controleur + + + Channel Filter + Filtre Canal + + + 14 + 14 + + + 10 + 10 + + + 6 + 6 + + + 12 + 12 + + + 4 + 4 + + + 2 + 2 + + + 9 + 9 + + + 8 + 8 + + + 3 + 3 + + + 13 + 13 + + + 15 + 15 + + + 16 + 16 + + + 7 + 7 + + + 11 + 11 + + + 5 + 5 + + + 1 + 1 + + + + MidiInputTransformDialog + + New + Nouveau + + + + MidiInputTransformDialogBase + + MusE: Midi Input Transformator + MusE: Transformateur d'Entrée Midi + + + Filter + Filtre + + + All + Tous + + + Equal + Egal + + + Unequal + Différent de + + + Note + Note + + + Poly Pressure + Pression Poly + + + Control Change + Controle de Changement + + + Aftertouch + Pression + + + Pitch Bend + Molette de modulation + + + NRPN + NRPN + + + RPN + RPN + + + Value 2 + Valeur 2 + + + Value 1 + Valeur 1 + + + Event Type + Type d'Evènements + + + Ignore + Ignore + + + Higher + Plus Haut + + + Lower + Plus Bas + + + Inside + A l'intérieur + + + Outside + Al'extérieur + + + Channel + Canal + + + Port + Port + + + Processing + Travail + + + Keep + Garder + + + Fix + Fixer + + + Plus + Plus + + + Minus + Moins + + + Multiply + Multiplier + + + Divide + Diviser + + + Invert + Inverser + + + ScaleMap + Echelle + + + Flip + Retourner + + + Dyn + Dyn + + + Random + Aléatoire + + + Modules + Modules + + + 1 + 1 + + + 2 + 2 + + + 3 + 3 + + + 4 + 4 + + + enable modul 1 + Activer module 1 + + + enable modul 2 + Activer module 2 + + + enable modul 3 + Activer module 3 + + + enable modul 4 + Activer module 4 + + + Preset + Réglages enregistrés + + + Name: + Nom: + + + Comment: + Commentaires: + + + Function + Fonction + + + &New + &Nouveau + + + create new preset + Crée un nouveau réglage + + + &Delete + &Efface + + + delete preset + efface un réglage + + + &Dismiss + &Rejeter + + + PresetList + Liste de Réglages + + + + MidiPortRouteBase + + MusE: Midi Port Routing + + + + Port 2 + + + + Output + + + + Input + + + + + MidiRawDeviceDialogBase + + MusE: raw midi device configuration + MusE: configuration des périphériques Midi + + + Name + Nom + + + Device + Périphérique + + + Type + Type + + + Virt. Ports + Ports virtuels + + + Speed + Vitesse + + + Handshaking + Méthode (handshaking) + + + Device Properties + Propriétés du périphérique + + + Virt.Ports + Ports virtuels + + + Raw Device + Périphérique pur (raw) + + + Serial Port + Port série + + + Pipe + Tuyau (Pipe) + + + Device Path + Chemin du périphérique + + + 9600 + 9600 + + + 19200 + 19200 + + + 38400 + 38400 + + + None + Aucun + + + RTS/CTS + RTS/CTS + + + Xon/Xoff + Xon/Xoff + + + &New + &Nouveau + + + &Delete + &Effacer + + + &OK + &OK + + + &Cancel + &Annuler + + + + MidiStrip + + Var + Var + + + Rev + Rev + + + Cho + Cho + + + dB + dB + + + Pan + Pan + + + mute + silence + + + pre fader listening + écoute pre fader + + + + MidiSyncConfigBase + + MusE: Midi Sync + MusE: Synchro Midi + + + Apply + Appliquer + + + Ok + Ok + + + Cancel + Annuler + + + hour + heure + + + h + h + + + minute + minute + + + m + m + + + second + second + + + s + s + + + frame + Armature (frame) + + + f + f + + + subframe + Armature fine (subframe) + + + 24 + 24 + + + 25 + 25 + + + 30D + 30D + + + 30N + 30N + + + Id: + Id: + + + device id + Id. du périphérique + + + Port: + Port: + + + midi port + port midi + + + Sync Source + Source de la synchro + + + accept MTC + accepter MTC + + + accept Midi Clock + accepter Horloge Midi + + + accept MMC + accepter MMC + + + Sync Gen + Générer Synchro + + + Midi Time Code (MTC) + Code Temporel Midi (MTC) + + + Midi Clock + Horloge Midi + + + Midi Machine Control (MMC) + Controle Machine MIDI (MMC) + + + Sync Mode + Mode de synchro + + + Master + Maitre + + + Slave + Esclave + + + all + tous + + + MTC + MTC + + + Type: + Type: + + + Offset: + Décalage: + + + + MidiTrackInfoBase + + MusE: TrackInfo + MusE: InfoPiste + + + output channel + canal de sortie + + + all midi events are send to this output channel + tous les évènements midi seront envoyés vers cette sortie + + + Track Info + Info Piste + + + % + % + + + Track Name + Nom de Piste + + + output port + port de sortie (Output Ch.) + + + off + off + + + change stereo position + changer la position stéréo + + + OCh. + OCh. + + + MidiThru + MidiThru + + + ??? + ??? + + + select instrument patch + choisissez le groupe d'instruments + + + Transp. + Transp. + + + Volume + Volume + + + Channel Info + Info canal + + + Pan + Pan + + + Delay + Délai + + + H-Bank + H-Bank + + + Compr. + Compr. + + + L-Bank + L-Bank + + + Progr. + Progr. + + + Velocity + Vélocité + + + Length + Longueur + + + input ports + ports d'entrée (Input Ch.) + + + IChan. + IChan: + + + input channels + canaux d'entrée + + + 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 + Les évènements de tous les canaux +configurés sont enregistrés sur cette piste. +Vous pouvez spécifier plus d'un canal +pour l'enregistrement: + 1 2 3enregistre depuis les canaux 1, 2 et 3 + 1-3idem + 1-3 5 enregistre depuis les canaux 1, 2, 3 et 5 + + + Rec + Enr + + + Output Channel + + + + Modify Note Length + + + + Output Port + + + + Track Delay (ticks) + + + + Compress Note Velocity + + + + Pitch Transpose + + + + Modify Note Velocity + + + + Input Ports + + + + Input Channels + + + + Select Instrument Patch + + + + Bank Select LSB + + + + Bank Select MSB + + + + Instrument High Bank + + + + Instrument Low Bank + + + + Instrument/Program/Patch + + + + + MidiTransformDialogBase + + MusE: Midi Transformator + MusE: Transformateur Midi + + + &New + &Nouveau + + + &Delete + &Effacer + + + &Apply + &Appliquer + + + &OK + &Ok + + + &Cancel + &Annuler + + + PresetList + ListRéglages + + + Processing + Transformations + + + Event Type + Type d'évènements + + + Keep + Garder + + + Fix + Fixer + + + Note + Note + + + Poly Pressure + Pression Poly + + + Control Change + Changement de Controle + + + Aftertouch + Pression + + + Pitch Bend + Molette de modulation + + + NRPN + NRPN + + + RPN + RPN + + + Plus + Addition + + + Minus + Soustraction + + + Multiply + Multiplication + + + Divide + Division + + + Value 2 + Valeur 2 + + + Invert + Inverser + + + ScaleMap + Echelle + + + Flip + Retourner + + + Dyn + Dyn + + + Random + Aléatoire + + + Value 1 + Valeur 1 + + + Length + Longueur + + + Position + Position + + + Filter + Filtre + + + All + Tous + + + Equal + Egal + + + Unequal + Différent + + + Ignore + Ignore + + + Higher + Plus haut + + + Lower + Plus bas + + + Inside + A l'intérieur + + + Outside + A l'extérieur + + + Bar Range + Type de mesure + + + Preset + Réglages + + + Name: + Nom: + + + Comment: + Commentaire: + + + Range + Type + + + process all events + Transformer tous les évènements + + + selected tracks + pistes sélectionnées + + + inside loop + dans la boucle + + + Function + fonction + + + Select + Sélectionner + + + Quantize + Quantiser + + + Delete + Effacer + + + Transform + Transformer + + + Insert + Insérer + + + Copy + Copier + + + Extract + Extraire + + + Quantize Value + Valeur de Quantisation + + + Sysex + SysEx + + + Meta + + + + + MidiTransformerDialog + + New + + + + + MixdownFileDialog + + Wave Files (*.wav);;All Files (*) + Fichiers Wave (*.wav);;Tous les Fichiers (*) + + + + MixdownFileDialogBase + + MusE: Set Mixdown Wavefile + MusE: Fichier wav pour mixage + + + &OK + &OK + + + &Cancel + &Annuler + + + File Path + Chemin d'accés + + + Channel + Canal + + + Stereo + Stéréo + + + Mono + Mono + + + 5.1 + 5.1 + + + wav,16 Bit + wav,16 Bit + + + wav, 24 Bit + v, 24 Bit + + + wav, 32 Bit (float) + wav, 32 Bit (flottant) + + + Format + Format + + + + Mixer + + Mute + Muet + + + MusE: Midi Mixer + MusE: Mixeur Midi + + + Rev + Rev + + + Cho + Cho + + + Var + Var + + + Pan + Pan + + + Master + Maitre + + + Port + Port + + + + MusE + + &File + &Fichier + + + Open &Recent + Ouvrir &Récent + + + Save &As + Enregistrer &Sous + + + Config &Printer + Configuration Im&primante + + + Import Midifile + Importer fichier MIDI + + + Export Midifile + Exporter fichier MIDI + + + Import Wave File + Importer fichier WAV + + + &Quit + &Quitter + + + &Edit + &Edition + + + C&ut + Co&uper + + + &Copy + &Copier + + + &Paste + Co&ller + + + Delete Track + Effacer Piste + + + Add Track + Ajouter Piste + + + Select &All + Selectionner &Tout + + + &Deselect All + &Dé-selectionner tout + + + Invert &Selection + Inverser la &Sélection + + + &Inside Loop + A l'&intérieur de la Boucle + + + &Outside Loop + A l'e&xtérieur de la Boucle + + + All &Parts on Track + Tous les &bouts de la Piste + + + Select + Sélectionner + + + Drums + Batterie + + + List + Liste + + + Graphic + Graphique + + + Mastertrack + PistePrincipale + + + Midi &Transform + &Transformation MIDI + + + Modify Gate Time + Modifier la Durée du Pont (Gate Time) + + + Modify Velocity + Modifier la vélocité + + + Crescendo + Crescendo + + + Transpose + Transposition + + + Thin Out + Sortie fine + + + Erase Event + Effacer évènements + + + Note Shift + Décalage de note + + + Move Clock + Décalage horloge + + + Copy Measure + Copier la mesure + + + Erase Measure + Effacer la mesure + + + Delete Measure + Supprimer la mesure + + + Create Measure + Créer une mesure + + + Mix Track + Mixer Piste + + + Midi + MIDI + + + &Structure + &Structure + + + Global Cut + Couper tout + + + Global Insert + Insérer tout + + + Global Split + Diviser Tout + + + Copy Range + Limites de Copie + + + Cut Events + Couper Evènements + + + &Display + &Affichage + + + Transport Panel + Panneau de Controle + + + Bigtime window + Fenetre GrandeHorloge + + + dont follow Song + Ne pas suivre la chanson + + + follow page + Défilement par page + + + follow continuous + Défilement fin + + + &Config + &Configuration + + + Global Settings + Paramètres Généraux + + + follow song + Suivre la chanson + + + Metronome + Métronome + + + Midi Sync + Synchro MIDI + + + Midi File Config + Paramètres du fichier MIDI + + + Appearance settings + Apparance + + + Soft Synthesizer + Synthétiseur virtuel + + + Midi Ports + Ports MIDI + + + Audio System + System Audio + + + Save Configuration + Sauvegarder la Configuration + + + Midi Input Transform + Transformations Entrée MIDI + + + Midi Input Filter + Filtres pour l'Entrée MIDI + + + Midi Remote Control + Controle MIDI a distance + + + Random Rhythm Generator + Générateur aléatoire de rythmes + + + &Midi + &MIDI + + + Mixer + Mixer + + + Define Controller + Définir Controleur + + + Input Plugins + Plugins d'Entrée + + + Reset Instr. + Ré-initialisation des Instruments + + + Init Instr. + Init. Instr. + + + local off + local off + + + &Audio + &Audio + + + Cliplist + ListClip + + + Bounce to Track + Rebondir (bounce) sur la piste + + + Bounce to File + Rebondir (bounce) sur Fichier + + + Bounce + Rebondir (bounce) + + + &Help + &Aide + + + Browser + Navigateur + + + &About + &A propos + + + About&Qt + A propos de &Qt + + + What's &This + Qu'est-ce que c'es&t + + + MusE: load project + Muse: charger Projet + + + The current Project contains unsaved data +Save Current Project? + Le Projet en cours contient des données non encore sauvegardées. +Enregistrer? + + + &Save + &Enregistrer + + + &Nosave + &Pas d'enregistrement + + + &Abort + &Annuler + + + MusE: Save As + MusE: enregistrer sous + + + MusE: Import Midi + MusE: importer fichier MIDI + + + MusE: Export Midi + MusE: exporter fichier MIDI + + + Nothing to edit + Rien à éditer + + + The current Project contains unsaved data +Load overwrites current Project: +Save Current Project? + Le Projet en cours contient des données non sauvegardées. +Enregistrer? + + + &Overwrite + Ec&raser + + + no help found at: + Pas d'aide trouvée ici: + + + MusE: Open Help + MusE: Ouvrir l'Aide + + + to import a audio file you have first to selecta audio track + Pour importer in fichier AUDIO, sélectionner d'abord une piste AUDIO + + + UndoRedo + AnnulerRefaire + + + undo + annuler + + + Und&o + &Annuler + + + redo + Refaire + + + Re&do + Re&faire + + + undo last change to song + Annuler le dernier changement sur la chanson + + + redo last undo + Annuler l'annulation (refaire) + + + Transport + Transport + + + loop + boucle + + + Loop + Boucle + + + punchin + Punch-In + + + Punchin + Punch-In + + + punchout + Punch-Out + + + Punchout + Punch-Out + + + start + démarrer + + + Start + Démarrer + + + rewind + rembobiner + + + Rewind + Rembobiner + + + forward + avance + + + Forward + Avance + + + stop + stop + + + Stop + Stop + + + play + jouer + + + Play + Jouer + + + record + enregistrer + + + Record + Enregistrer + + + panic + panique! + + + Panic + Panique! + + + new + nouveau + + + &New + &Nouveau + + + open + ouvrir + + + &Open + &Ouvrir + + + save + enregistrer + + + pianoroll + rouleau Piano + + + Pianoroll + Rouleau-Piano + + + score + partition + + + Score + Partition + + + marker + marqueur + + + Marker + Marker + + + File Buttons + Boutons Fichiers + + + Unknown File Format + Format de fichier inconnu + + + none + aucun + + + MusE: Write File failed + MusE: échec de l'enregistrement + + + MusE: About + MusE: A propos + + + MusE: Song: + MusE: chanson + + + reading midifile + + lecture du fichier MIDI + + + +failed + Echec + + + MusE: Copy Range + MusE: limites de la copie + + + not implemented + Non-implémenté (désolé) + + + MusE: Cut Events + MusE: Couper Evènements + + + MusE: Bounce to Track + MusE: Rebondir sur la piste (bounce) + + + more than one target track selected + vous avez sélectionné plus d'une piste en destination + + + wrong target track type, +select wave track as target + mauvais type de piste en destination, +choisissez une piste AUDIO en destination + + + no target track selected + vous n'avez pas sélectionné de piste de destination + + + Delete Selected Tracks + + + + Edit Instrument + + + + Configure shortcuts + + + + Midi File Export + + + + &Manual + + + + &MusE homepage + + + + &Report Bug... + + + + &About MusE + + + + What's &This? + + + + Cannot read template + + + + File open error + + + + File read error + + + + MusE: load template + + + + MusE: Bounce + + + + set left/right marker for bounce range + + + + MusE: Bounce to File + + + + no output track found + + + + Add midi file to current project? + + + + + &Add to Project + + + + &Replace + + + + +failed: + + + + Arranger + Arrangeur + + + Cursor + Curseur + + + Off + + + + Bar + Mesure + + + Snap + Aligne + + + Len + + + + Pitch + Hauteur + + + midi pitch + hauteur midi + + + global midi pitch shift + transposition midi globale + + + Tempo + Tempo + + + midi tempo + tempo midi + + + N + N + + + MusE: Create tmp file failed + + + + &View + + + + Mixer 1 + + + + Mixer 2 + + + + Setti&ngs + + + + + NoteInfo + + Start + Début + + + Len + Lon + + + Pitch + Hauteur + + + Velo On + Velo on + + + Velo Off + Velo off + + + Note Info + Info Note + + + + OrganGuiBase + + MusE: Organ + MusE: Orgue + + + Presets + Presets + + + Set + Set + + + load preset list + charger la liste des presets + + + save preset list + enregistrer la liste des presets + + + O-1 + 0-1 + + + Oscillator + Oscillateur + + + Brass + Cuivres + + + Reed + Roseau + + + Flute + Flute + + + Drawbars + Grands Tuyaux + + + 16' + 16' + + + 4' + 4' + + + 2 2/3' + 2 2/3' + + + 2' + 2' + + + 8' + 8' + + + 5 1/3' + 5 1/3' + + + Envelope Lo + Enveloppe basse (Lo) + + + Attack(ms) + Attaque (en ms) + + + Decay(ms) + Affaiblissement (ms) + + + Sustain(%) + Tenue (%) + + + Release(ms) + Relachement (ms) + + + Envelope Hi + Enveloppe Haute (Hi) + + + Release + + + + Sustain + + + + Decay + + + + Attack + + + + ms + + + + cB + + + + Velocity + Vélocité + + + + PageSettings + + Paper Size + Dimension de la feuille + + + user + utilisateur + + + Margins + Marges + + + Header + En-Tte + + + Title + Titre + + + Author + Auteur + + + Fonts + Polices + + + Page No. + N° de page + + + Measure No + N° de mesure + + + Track Name + Nom de la Piste + + + Lyrics + Paroles + + + Layout + Disposition + + + Scale + Echelle + + + Flags + Drapeaux + + + show page no. + Montrer la page N° + + + show measure no. + Montrer la mesure N° + + + show track name + Montrer le nom des Pistes + + + Ok + Ok + + + Apply + Appliquer + + + Cancel + Annuler + + + left Margin + Marge de gauche + + + top Margin + Marge du haut + + + right Margin + Marge de droite + + + bottom Margin + Marge du bas + + + Bars across the Page + Mesures par Page + + + + PartCanvas + + Cannot copy/move/clone to different Track-Type + Ne peut copier/déplacer vers une type de Piste différent + + + C&ut + Co&uper + + + &Copy + &Copier + + + rename + renommer + + + color + couleur + + + delete + effacer + + + split + séparer + + + glue + coller + + + de-clone + annuler-clonage + + + pianoroll + piano-roll + + + score + partition + + + list + liste + + + drums + batterie + + + wave edit + édition wav + + + Cannot paste: multiple tracks selected + Ne peut coller: plusieurs pistes sélectionnées + + + Cannot paste: no track selected + Ne peut coller: pas de piste choisie + + + Cannot paste midi parts to wave track + Ne peut coller des bouts MIDI sur des pistes AUDIO + + + Cannot paste wave parts to midi track + Ne peut copier des bouts AUDIO sur des pistes MIDI + + + Cannot paste: wrong data type + Ne peut coller: mauvais type de donnée + + + + PatchBay + + MusE: ALSA MIDI Patch Bay + MusE: Baie de Patches MIDI ALSA + + + + PatchBayBase + + ALSA Patch Bay + Baie de Patches ALSA + + + + PianoRoll + + &Edit + &Edition + + + Cut + Couper + + + Copy + Copier + + + Paste + Coller + + + Delete Events + Effacer Evènements + + + Select All + Sélectionner tout + + + Select None + Dé-sélectionner + + + Invert + Inverser + + + Inside Loop + Dans la Boucle + + + Outside Loop + Hors de la Boucle + + + &Select + &Sélectionner + + + blue + bleu + + + pitch colors + couleurs pour la hauteur + + + velocity colors + couleurs pour la vélocité + + + &Config + &Configuration + + + event color + couleur pour les évènements + + + &Functions + &Fonctions + + + Over Quantize + Plus de Quantisation + + + Note On Quantize + Quantisation Appui de Note + + + Note On/Off Quantize + Quantisation Appui/Relachement de Note + + + Iterative Quantize + Quantisation itérative + + + Config Quant... + Config. Quant. + + + Modify Gate Time + Modifier temps de fermeture (gate time) + + + Modify Velocity + Modifier la vélocité + + + Crescendo + Crescendo + + + Transpose + Transposition + + + Thin Out + Sortie fine + + + Erase Event + Effacer Evènements + + + Note Shift + Décalage de Note + + + Move Clock + Décalage temporel + + + Copy Measure + Copier mesure + + + Erase Measure + Effacer mesure + + + Delete Measure + Supprimer mesure + + + Create Measure + Créer mesure + + + Pianoroll Tools + Outils de piano-roll + + + Step Record + Enregistrement pas-a-pas + + + Midi Input + Entrée MIDI + + + Play Events + Jouer Evènements + + + Add Controller View + Ajouter une vue de contrles + + + ctrl + ctrl + + + + PluginDialog + + Ok + Ok + + + Cancel + Annuler + + + MusE: select plugin + MusE: choisir plugin + + + Lib + Lib + + + Label + Label + + + Name + Nom + + + AI + + + + AO + + + + CI + + + + CO + + + + IP + + + + id + + + + Maker + + + + Copyright + Copyright + + + Stereo and Mono + + + + Stereo + Stéréo + + + Mono + Mono + + + All + Tous + + + 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. + + + + + PluginGui + + bypass plugin + + + + MusE: load preset + + + + MusE: save preset + + + + File Buttons + Boutons Fichiers + + + Load Preset + + + + Save Preset + + + + + QHeader + + output channel + canal de sortie + + + output port + port de sortie (Output Ch.) + + + + QPopupMenu + + Add Midi Generator... + + + + Add Soft Synth... + + + + + QWidget + + new + nouveau + + + File + + + + + +exists + + + + MusE: write + + + + Overwrite + + + + Quit + + + + None + Aucun + + + + RhythmBase + + Instrument + Instrument + + + &New + &Nouveau + + + create new entry + Crée une nouvelle entrée + + + pressing the New button you create a new entry +in the MusE list of defined controllers + Crée une nouvelle entrée dans la liste des controleurs + + + delete selected entry + efface l'entrée sélectionnée + + + list of defined controllers + list des controleurs définis + + + This is the MusE list of defined controllers. + C'est la liste des controleurs qui ont été définis + + + &File + &Fichier + + + &Help + &Aide + + + Save + Enregistrer + + + &Save + &Enregistrer + + + Cut + Couper + + + Copy + Copier + + + Paste + Coller + + + &Paste + Co&ller + + + + RhythmGenerator + + Form3 + Form3 + + + Instrument + Instrument + + + delete + effacer + + + Save + Enregistrer + + + + RouteDialogBase + + MusE: Routing + + + + Add Route + + + + Source: + + + + Destination: + + + + Connect + + + + connect source to destination + + + + Current Routes + + + + Source + + + + Destination + + + + Remove + + + + remove selected route + + + + + SS_PluginChooserBase + + SimpleDrums - Ladspa Plugin Chooser + + + + Name + Nom + + + Label + Label + + + Inports + + + + Outports + + + + Creator + + + + &Cancel + + + + Alt+C + + + + &OK + + + + Alt+O + + + + + ShortcutCaptureDialogBase + + OK + OK + + + Enter shortcut sequence + + + + Press keys to enter shortcut sequence! + + + + Old shortcut: + + + + Undefined + + + + New shortcut: + + + + Cancel + + + + + ShortcutConfig + + Global + Global + + + Arranger + Arrangeur + + + Pianoroll + Rouleau-Piano + + + Drumeditor + + + + List editor + + + + List Mastertrack + + + + All categories + + + + Transport: Start playback from current location + + + + Transport: Toggle metronome + + + + Transport: Stop Playback + + + + Transport: Play, Stop, Rewind + + + + Transport: Goto left marker + + + + Transport: Goto right marker + + + + Transport: Toggle Loop section + + + + Transport: Toggle Record + + + + Edit: Copy + + + + Edit: Undo + + + + Edit: Redo + + + + Edit: Cut + + + + Edit: Paste, + + + + Edit: Delete + + + + File: New project + + + + File: Open from disk + + + + File: Save project + + + + File: Open recent file + + + + File: Save as + + + + File: Load template + + + + File: Import midi file + + + + File: Export midi file + + + + File: Import audio file + + + + File: Quit MusE + + + + Edit: Select parts on track + + + + Open pianoroll + + + + Open drumeditor + + + + Open listeditor + + + + Open graphical mastertrack editor + + + + Open list mastertrack editor + + + + Open midi transformer + + + + Add midi track + + + + Add drum track + + + + Add wave track + + + + Add audio output + + + + Add audio group + + + + Add audio input + + + + Add audio aux + + + + Structure: Global cut + + + + Structure: Global insert + + + + Structure: Global split + + + + Structure: Copy range + + + + Structure: Cut events + + + + View: Open mixer window + + + + View: Toggle transport window + + + + View: Toggle bigtime window + + + + View: Open marker window + + + + Settings: Follow song by page + + + + Settings: Follow song off + + + + Settings: Follow song continuous + + + + Settings: Global configuration + + + + Settings: Configure shortcuts + + + + Settings: Configure metronome + + + + Settings: Midi sync configuration + + + + Settings: Midi file export configuration + + + + Settings: Appearance settings + + + + Settings: Midi ports / Soft Synth + + + + Settings: Audio subsystem configuration + + + + Midi: Edit midi instruments + + + + Midi: Open midi input transform + + + + Midi: Open midi input filter + + + + Midi: Midi input transpose + + + + Midi: Midi remote control + + + + Midi: Random rhythm generator + + + + Midi: Reset midi + + + + Midi: Init midi + + + + Midi: Midi local off + + + + Audio: Bounce audio to track + + + + Audio: Bounce audio to file + + + + Audio: Restart audio + + + + Automation: Mixer automation + + + + Automation: Take mixer snapshot + + + + Automation: Clear mixer automation + + + + Help: Open Manual + + + + Help: Toggle whatsthis mode + + + + Edit: Edit selected part + + + + Edit: Select nearest part on track above + + + + Edit: Add nearest part on track above + + + + Edit: Select nearest part on track below + + + + Edit: Add nearest part on track below + + + + Midi: Transpose + + + + Edit: Select all + + + + Edit: Select none + + + + Edit: Invert selection + + + + Edit: Select events/parts inside locators + + + + Edit: Select events/parts outside locators + + + + Edit: Select nearest part/event to the left + + + + Edit: Add nearest part/event to the left to selection + + + + Edit: Add nearest part/event to the right to selection + + + + Edit: Set locators to selection + + + + Edit: Increase pitch + + + + Edit: Decrease pitch + + + + Edit: Set fixed length on midi events + + + + Quantize: Over Quantize + + + + Quantize: Note On Quantize + + + + Quantize: Note On/Off Quantize + + + + Quantize: Iterative Quantize + + + + Quantize: Configure quant + + + + Quantize: Modify Gate Time + + + + Quantize: Modify Velocity + + + + Edit: Crescendo + + + + Edit: Thin Out + + + + Edit: Erase Event + + + + Edit: Note Shift + + + + Edit: Move Clock + + + + Edit: Copy Measure + + + + Edit: Erase Measure + + + + Edit: Delete Measure + + + + Edit: Create Measure + + + + Edit: Change event color + + + + Tool: Pointer + + + + Tool: Pencil + + + + Tool: Eraser + + + + Tool: Line Draw + + + + Tool: Scissor + + + + Tool: Glue + + + + Tool: Mute + + + + Transport: Increase current position + + + + Transport: Decrease current position + + + + Quantize: Set quantize to 1/1 note + + + + Quantize: Set quantize to 1/2 note + + + + Quantize: Set quantize to 1/4 note + + + + Quantize: Set quantize to 1/8 note + + + + Quantize: Set quantize to 1/16 note + + + + Quantize: Set quantize to 1/32 note + + + + Quantize: Set quantize to 1/64 note + + + + Quantize: Toggle triol quantization + + + + Quantize: Toggle punctuation quantization + + + + Quantize: Toggle punctuation quantization (2) + + + + Edit: Insert at location + + + + Insert Note + Insérer Note + + + Insert SysEx + Insérer SysEx + + + Insert Ctrl + Insérer Ctrl + + + Insert Meta + Insérer Meta + + + Insert Channel Aftertouch + Insérr Canal de Pression + + + Insert Key Aftertouch + Insérer une note de Pression + + + Edit: Increase event position + + + + Edit: Decrease event position + + + + Insert Tempo + + + + Insert Signature + + + + Change Event Position + + + + Edit Event Value + + + + + ShortcutConfigBase + + &Apply + &Appliquer + + + Configure Keyboard Shortcuts + + + + Shortcut Category + + + + Description + + + + Shortcut + + + + &Clear + + + + Alt+C + + + + &Define + + + + Alt+D + + + + Alt+A + + + + + SimpleDrumsGuiBase + + DrumSynth 0.1 + + + + + SynthConfigBase + + Soft Synthesizer + Synthétiseur virtuel + + + Name + Nom + + + Midi Port + Port MIDI + + + + TList + + Delete Track + Effacer Piste + + + Track Comment + Commentaire pour la Piste + + + + TempoSig + + Tempo/Sig + + + + + Toolbar1 + + Snap + Aligne + + + Quantize + Quantiser + + + All Events + Tous les Evènements + + + Cursor + Curseur + + + + Transport + + Punch In + + + + Loop + Boucle + + + Punch Out + + + + Left Mark + + + + Right Mark + + + + Overdub + + + + Replace + + + + Rec Mode + + + + Normal + + + + Mix + + + + Cycle Rec + + + + punchin + Punch-In + + + loop + boucle + + + punchout + Punch-Out + + + rewind to start + + + + rewind + rembobiner + + + forward + avance + + + stop + stop + + + play + jouer + + + record + + + + AC + + + + quantize during record + + + + Click + + + + metronom click on/off + + + + Sync + + + + external sync on/off + + + + Master + + + + use master track + Utiliser la piste principale + + + + TransposeDialogBase + + Value + Valeur + + + Time + Temps + + + all + tous + + + Parts + Pièces + + + OK + OK + + + MusE: Midi Transpose + + + + halftones + + + + between markers + + + + all in selected tracks + + + + Cancel + + + + + VelocityBase + + All Events + Tous les Evènements + + + Selected Events + Evènements choisis + + + Looped Events + Evènements bouclés + + + Selected & Looped + Boucle & sélectionnée + + + Values + Valeurs + + + Rate: + Vitesse: + + + Offset: + Décalage: + + + % + % + + + OK + OK + + + MusE: Modify Velocity + + + + Range + Entre + + + Cancel + + + + + WTScale + + bar scale + Echelle de la mesure + + + + WaveEdit + + Cursor + Curseur + + + &File + &Fichier + + + + WaveTrackInfoBase + + MusE: TrackInfo + MusE: InfoPiste + + + Track Info + Info Piste + + + Mono + Mono + + + Stereo + Stéréo + + + Track Name + Nom de la Piste + + + off + arr + + + Track Delay (ticks) + + + + Delay + + + + Delay (Frames) + + + + diff --git a/muse/share/locale/muse_ru.qm b/muse/share/locale/muse_ru.qm new file mode 100644 index 00000000..06d9d3ab Binary files /dev/null and b/muse/share/locale/muse_ru.qm 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 @@ + + + + + Insert Note + Вставить ноту + + + Insert SysEx + Вставить SysEx + + + Insert Ctrl + Вставить контроллер + + + Insert Meta + Вставить Meta + + + Insert Channel Aftertouch + Вставить Channel Aftertouch + + + Insert Key Aftertouch + Вставить Key Aftertouch + + + + @default + + Click this button to stop playback + Нажмите эту кнопку для остановки воспроизведения + + + Click this button to start playback + Нажмите эту кнопку для начала воспроизведения + + + Click this button to rewind to start position + Нажмите эту кнопку для перемещения к началу + + + Click this button to rewind + Нажмите эту кнопку для перемотки назад + + + Click this button to forward current play position + Нажмите эту кнопку для перемещения вперёд + + + Click this button to open a <em>new song</em>.<br>You can also select the <b>Open command</b> from the File menu. + Нажмите эту кнопку для открытия <em>другой композиции</em>.<br>Вы также можете выбрать пункт <b>Открыть</b> в меню "Файл". + + + 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. + Нажмите эту кнопку для сохранения редактируемой композиции. +Вы также можете выбрать пункт <b>Открыть</b> в меню "Файл". + + + Create New Song + Создать новую композицию + + + loop between left mark and right mark + Цикл между левым и правым маркерами + + + record starts at left mark + Запись начинается от маркера слева + + + record stops at right mark + Запись останавливается по маркеру справа + + + rewind to start position + Перемотать к начальной позиции + + + rewind current position + Перемотать к текущей позиции + + + move current position + Переместить текущую позицию + + + stop sequencer + Остановить секвенсер + + + start sequencer play + Начать воспроизведение из секвенсера + + + to record press record and then play + Для начала записи нажмите "Записать", а затем "Воспроизвести" + + + send note off to all midi channels + Послать note off на все MIDI-каналы + + + presets (*.pre *.pre.gz *.pre.bz2) + Предустановки (*.pre *.pre.gz *.pre.bz2) + + + All Files (*) + Все файлы (*) + + + Add Midi Track + Добавить MIDI-дорожку + + + Add Drum Track + Добавить дорожку с ударными + + + Add Wave Track + Добавить звуковую дорожку + + + Add Audio Output + Добавить звуковой выход + + + Add Audio Group + Добавить звуковую группу + + + Add Audio Input + Добавить звуковой вход + + + Add Aux Send + Добавить aux посыл + + + Click this button to enable recording + Нажмите эту клавишу для начала записи + + + Midi Strips + + + + Add Midi Output Port + + + + Add Midi Input Port + + + + Audio Strips + + + + + AboutBox + + AboutBox + О программе + + + Keep On Rocking! + + + + 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 + Версия 0.7.0 + +(C) Copyright 1999-2004 Werner Schweer и другие. +Новые версии и подробности смотрите на сайте +http://lmuse.sourceforge.net + +Опубликовано на условиях GNU Public License + + + + Appearance + + MusE: load image + MusE: загрузить изображение + + + + AppearanceDialogBase + + MusE: Appearance settings + MusE: Настройки облика + + + Apply + Применить + + + Ok + ОК + + + Cancel + Отменить + + + Arranger + Компоновщик + + + Parts + Части + + + show names + показывать рамки + + + show events + показывать события + + + show Cakewalk Style + показывать в стиле Cakewalk + + + Events + События + + + note on + note on + + + poly pressure + полифоническое послекасание + + + controller + контроллер + + + aftertouch + послекасание + + + pitch bend + смена высоты звука + + + program change + смена программы + + + special + специальная + + + Background picture + Фоновое изображение + + + bg + фон + + + select... + выбрать... + + + show snap grid + показывать сетку привязки + + + Colors + Цвета + + + Items + + + + Style/Fonts + Стиль/Шрифты + + + QT Theme + Тема QT + + + Windows + Окна + + + MusE + MusE + + + Metal + Металл + + + Norwegian Wood + Норвежское дерево + + + Platinum + Платина + + + CDE + CDE + + + Motif + Motif + + + Motif Plus + Motif Plus + + + Fonts + Шрифты + + + Family + Семейство + + + Size + Размер + + + Font 1 + Шрифт 1 + + + Font 2 + Шрифт 2 + + + Font 3 + Шрифт 3 + + + Font 0 + Шрифт 0 + + + Bold + Жирный + + + Italic + Курсив + + + ... + ... + + + Font 4 + Шрифт 4 + + + Font 5 + Шрифт 5 + + + Palette + Палитра + + + add to palette + Добавить в палитру + + + B + B + + + S + S + + + H + H + + + V + V + + + G + G + + + R + R + + + Itemdsfkajlk jölk ljfölajföajföajf + + + + + ClipListEditorBase + + MusE: ClipList + MusE: Список фрагментов + + + Name + Имя + + + Refs + + + + Start + Начало + + + Len + Длн + + + Data + Данные + + + Clip Properties + Свойства фрагмента + + + Pos: + Поз.: + + + Len: + Длн.: + + + + CommentBase + + Form1 + Form1 + + + Track Comment + Комментарий к дорожке + + + Track 1 + Дорожка 1 + + + + ConfigMidiCtrlBase + + MusE: Config Midi Controller + MusE: Настройка MIDI-контроллера + + + Midi Port: + MIDI-порт: + + + Available Controller: + Доступный контроллер: + + + Add + Добавить + + + Remove + Удалить + + + Automated Controller: + + + + &OK + &ОК + + + &Cancel + О&тменить + + + + ConfigMidiFileBase + + MusE: Config Midi File Export + MusE: Настройка экспорта в MIDI + + + &OK + &ОК + + + &Cancel + О&тменить + + + 0 (single track) + 0 (одиночная дорожка) + + + 1 (multiple tracks) + 1 (больше одной дорожки) + + + Format: + Формат: + + + 96 + 96 + + + 192 + 192 + + + 384 + 384 + + + Division: + + + + Copyright: + Авторские и смежные права: + + + Enable extended smf format + Разрешить расширенный формат SMF + + + + ConfigTrackListBase + + MusE: Config Track List + MusE: Настройка списка дорожек + + + Track Type: + Тип дорожки: + + + Audio Output + Аудиовыход + + + Audio Group + Аудиогруппа + + + Audio Aux + Audio Aux + + + Wave Track + Аудиодорожка + + + Audio Input + Аудиовход + + + Soft Synthesizer + Программный синтезатор + + + Midi Track + MIDI-дорожка + + + Drum Track + Перкуссионная дорожка + + + Available Items: + Доступные варианты: + + + Add + Добавить + + + Remove + Удалить + + + Up + Вверх + + + Down + Вниз + + + Configured Items + Настроенные дорожки + + + &OK + &ОК + + + &Cancel + О&тменить + + + Track Name Size: + + + + + DeicsOnzeGuiBase + + DeicsOnze + + + + &Presets + + + + LBA + + + + Subcategory + + + + PRO + + + + Preset + Предустановка + + + Bank numerous + + + + NONE + + + + Program numerous + + + + INITVOICE + + + + DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence + + + + HBA + + + + Category + + + + &Global + + + + Op4 Feedback + + + + Feedback level of the operator 4 + + + + Master Volume + + + + Master volume + + + + Modulation Matrix + + + + <b>Algorithm 1</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 2</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by both <i>Op 3</i> and <i>Op 4</i><br> +<b>Algorithm 3</b> : <i>Op 1</i> modulated by both <i>Op 4</i> and <i>Op 2</i> modulated by <i>Op 3</i><br> +<b>Algorithm 4</b> : <i>Op 1</i> modulated by both <i>Op 2</i> and <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 5</b> : (<i>Op 1</i> modulated by <i>Op 2</i>) add to (<i>Op 3</i> modulated by <i>Op 4</i>) <br> +<b>Algorithm 6</b> : addition of the three <i>Op 1, 2, 3</i> all modulated by <i>Op 4</i><br> +<b>Algorithm 7</b> : addition of the three <i>Op 1, 2, 3</i> with <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 8</b> : addition of the four <i>Op 1, 2, 3, 4</i> + + + + LFO + + + + LFO Sync + + + + Pitch modulation sensitivity + + + + Pitch Modulation Sensitivity + + + + LFO Delay + + + + LFO delay + + + + LFO speed + + + + Amplitude modulation depth + + + + Pitch modulation depth + + + + Amplitude modulation sensitivity + + + + Amplitude Modulation Sensitivity + + + + AMS + + + + LFO Waveform + + + + Pitch Modulation Depth + + + + PMD + + + + LFO Speed + + + + AMD + + + + Speed + + + + Delay + + + + PMS + + + + Pitch Envelope + + + + PL3 + + + + PL2 + + + + PL1 + + + + PR1 + + + + PR2 + + + + PR3 + + + + Op &1 + + + + OUT 1 + + + + Output Volume + + + + Volume + + + + Frequency 1 + + + + Coarse 1 + + + + Coarse Ratio + + + + Fine 1 + + + + Fine Ratio + + + + Freq 1 + + + + Fixed Frequency + + + + FIX + + + + Toggle Fix Frequency + + + + Sensitivity 1 + + + + KVS1 + + + + AME1 + + + + Amplitude Modulation Enable + + + + Keyboard Velocity Sensitivity + + + + Key Velocity Sensitivity + + + + EBS1 + + + + EG Bias Sensitivity + + + + Eg Bias Sensitivity + + + + Detune, OSCWave, EGShift 1 + + + + DET1 + + + + Detune + + + + Attack Rate of the operator 1 + + + + 96dB + + + + 48dB + + + + 24dB + + + + 12dB + + + + EG Shift + + + + Wave form + + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + Amplitude Envelope 1 + + + + RR1 + + + + D1R1 + + + + D1L1 + + + + D2R1 + + + + Release Rate + + + + 2° Decay Rate + + + + 1° Decay Level + + + + 1° Decay Rate + + + + Attack Rate + + + + AR1 + + + + Scaling 1 + + + + LS1 + + + + RS1 + + + + Rate Scaling + + + + Level Scaling + + + + Op &2 + + + + Sensitivity 2 + + + + EBS2 + + + + KVS2 + + + + AME2 + + + + Detune, OSCWave, EGShift 2 + + + + DET2 + + + + OUT 2 + + + + Scaling 2 + + + + LS2 + + + + RS2 + + + + Frequency 2 + + + + Coarse 2 + + + + Fine 2 + + + + Freq 2 + + + + Amplitude Envelope 2 + + + + D1R2 + + + + D1L2 + + + + D2R2 + + + + RR2 + + + + AR2 + + + + Op &3 + + + + Sensitivity 3 + + + + EBS3 + + + + KVS3 + + + + AME3 + + + + Detune, OSCWave, EGShift 3 + + + + DET3 + + + + Frequency 3 + + + + Coarse 3 + + + + Fine 3 + + + + Freq 3 + + + + OUT 3 + + + + Scaling 3 + + + + LS3 + + + + RS3 + + + + Amplitude Envelope 3 + + + + D1R3 + + + + D1L3 + + + + D2R3 + + + + RR3 + + + + AR3 + + + + Op &4 + + + + Sensitivity 4 + + + + EBS4 + + + + KVS4 + + + + AME4 + + + + Detune, OSCWave, EGShift 4 + + + + DET4 + + + + OUT 4 + + + + Scaling 4 + + + + LS4 + + + + RS4 + + + + Frequency 4 + + + + Coarse 4 + + + + Fine 4 + + + + Freq 4 + + + + amplitude Envelope 4 + + + + AR4 + + + + D1R4 + + + + D1L4 + + + + D2R4 + + + + RR4 + + + + &Fun + + + + Phony Mode + + + + POLY + + + + MONO + + + + Reverb + + + + Foot Control + + + + Pitch Bend Range + + + + Amplitude + + + + Pitch + Высота тона + + + Modulation Wheel + + + + Breath Control + + + + Envelope Bias + + + + Pitch Bias + + + + After Touch + Послекасание + + + Potamento + + + + FINGER + + + + FULL + + + + Portamento Mode + + + + PT + + + + Portamento Time + + + + Foot Switch + + + + Sustain + + + + Portamento + + + + Transpose + Транспонировать + + + &Config + + + + Configuration File + + + + Save + Сохранить + + + Load + + + + Quality + + + + High + + + + Middle + + + + Low + + + + NbrV + + + + Number of Voices + + + + Colors + Цвета + + + Red + + + + Green + + + + Blue + + + + Text + + + + Background + + + + Edit Text + + + + Edit Background + + + + Save Mode + + + + Save only the used presets into the project + + + + Save the entire set into the project + + + + Save the configuration into the project + + + + + EditCtrl7DialogBase + + MusE: Enter Controller + MusE: Ввести контроллер + + + Controller: + Контроллер: + + + Time Position: + Позиция во времени: + + + Value: + Значение: + + + controller value + значение контроллера + + + OK + ОК + + + Cancel + Отменить + + + + EditCtrlBase + + MusE: Edit Controller Event + + + + Time Position + Позиция во времени + + + Available Controller: + Доступный контроллер: + + + Create New Controller + Создать новый контроллер + + + Value + Значение + + + Controller + Контроллер + + + H-Bank + H-банк + + + L-Bank + L-банк + + + Program + Программа + + + off + выкл + + + &OK + &ОК + + + &Cancel + О&тменить + + + Midi Port: + MIDI-порт: + + + Midi Channel: + + + + Time Position: + Позиция во времени: + + + Patch Name + + + + + EditInstrumentBase + + MusE: Instrument Editor + MusE: Редактор инструментов + + + Patches + + + + Patch Name: + + + + High Bank: + + + + Low Bank: + + + + Program: + Программа: + + + d.c. + dont care + + + + d.c. + + + + Patch/Group + + + + &Delete + У&далить + + + Alt+D + Alt+D + + + &New Patch + + + + Alt+N + Alt+N + + + New Group + Новая группа + + + Drum + Ударные + + + GM + GM + + + GS + GS + + + XG + XG + + + Controller + Контроллер + + + Predefined Controller: + Предопределённый контроллер: + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Properties + Свойства + + + Name + Имя + + + Type + Тип + + + Control7 + Control7 + + + Control14 + Control14 + + + RPN + RPN + + + NRPN + NRPN + + + Pitch + Высота тона + + + Program + Программа + + + H-Ctrl + H-Ctrl + + + Midi Controller Number High Byte + + + + L-Ctrl + L-Ctrl + + + Midi Controller Number Low Byte + + + + Range + Область + + + Min + Мин + + + Max + Макс + + + Default + + + + Name + Имя + + + Type + Тип + + + Min Val + Мин знач + + + Max Val + Макс знач + + + list of defined controllers + список назначенных контроллеров + + + This is the MusE list of defined controllers. + Это список назначенных контроллеров для MusE. + + + SysEx + SysEx + + + Initialization + + + + Panic + + + + Hex Entry: + + + + &File + &Файл + + + Tools + Сервис + + + New + Новый + + + &New + &Новый + + + Ctrl+N + Ctrl+N + + + Open + Открыть + + + &Open... + &Открыть... + + + Ctrl+O + Ctrl+O + + + Save + Сохранить + + + &Save + &Сохранить + + + Ctrl+S + Ctrl+S + + + Save As + Сохранить как + + + Save &As... + Сохранить &как... + + + Exit + Выйти + + + E&xit + В&ыйти + + + + EditMetaDialogBase + + MusE: Enter Meta Event + MusE: Ввести метасобытие + + + OK + ОК + + + Cancel + Отменить + + + TextLabel1 + ТекстоваяМетка1 + + + Time Position: + Позиция во времени: + + + Meta Type: + Метатип: + + + Enter Hex + Введите Hex + + + + EditNoteDialogBase + + MusE: Enter Note + MusE: Ввести ноту + + + OK + ОК + + + Cancel + Отменить + + + Length: + Продолжительность: + + + Time Position: + Позиция во времени: + + + Pitch: + Высота тона: + + + Velocity On: + Скорость вкл.: + + + Velocity Off: + Скорость выкл.: + + + + EditSysexDialogBase + + MusE: Enter SysEx + MusE: Ввести SysEx + + + TimePosition: + Время: + + + Comment: + Комментарий: + + + OK + ОК + + + Cancel + Отменить + + + Known SysEx: + + + + Add + Добавить + + + + FLUIDGuiBase + + Form1 + Form1 + + + Soundfont + + + + Load + + + + + FLUIDSynthGuiBase + + FLUID Synth + + + + Load + + + + Delete + + + + Dump Info + + + + ID + + + + Fontname + + + + Chnl + + + + Soundfont + + + + Drum Chnl + + + + Level + + + + Width + + + + Damping + + + + Room Size + + + + Reverb + + + + CHANNEL SETUP + + + + Sine + + + + Triangle + + + + Type + Тип + + + Number + + + + Speed + + + + Depth + + + + Chorus + + + + Gain + + + + LOADED SOUNDFONTS + + + + + FileDialogButtons + + Form1 + Form1 + + + Global + Глобально + + + User + Домашний +каталог + + + Project + Проект + + + Load: + Загрузить: + + + Songdata + +Cofiguration + Композиции + +настройки + + + only +Songdata + только +композиции + + + + GateTimeBase + + MusE: Modify Gate Time + MusE: Изменить время звучания + + + Range + Область + + + All Events + Все события + + + Selected Events + Выбранные события + + + Looped Events + События в цикле + + + Selected & Looped + Выбранные и в цикле + + + Values + Значения + + + Rate: + Частота: + + + Offset: + Смещение: + + + % + % + + + OK + ОК + + + Cancel + Отменить + + + + GlobalSettingsDialogBase + + MusE: Global Settings + MusE: Общие настройки + + + &Apply + &Применить + + + &Ok + &ОК + + + &Cancel + О&тменить + + + Audio + Звук + + + Mixer + Микшер + + + dB + Дб + + + min. Meter Value + мин. значение индикатора + + + min.Slider Val + мин. значение ползунка + + + Midi + MIDI + + + Ticks + Тактовые импульсы (тики) + + + 1024 + 1024 + + + 2048 + 2048 + + + 4096 + 4096 + + + 8172 + 8172 + + + Displayed Resolution +(Ticks/Quarternote) + Отображаемое разрешение +(Тиков/четвертей) + + + 48 + 48 + + + 96 + 96 + + + 192 + 192 + + + 384 + 384 + + + 768 + 768 + + + 1536 + 1536 + + + 3072 + 3072 + + + 6144 + 6144 + + + 12288 + 12288 + + + RTC Resolution +(Ticks/Sec) + RTC-разрешение +(тиков/сек) + + + GUI + GUI + + + Help Browser: + В чём читать справку: + + + GUI Refresh Rate + Частота обновления GUI + + + /sec + /сек + + + Application + Приложение + + + Start Muse + + + + start with last song + + + + start with song + + + + start song: + + + + Views + Виды + + + y-pos + + + + show + + + + x-pos + + + + height + высота + + + width + ширина + + + Big Time + Хронометр + + + Arranger + Компоновщик + + + Transport + Транспорт + + + Cur + + + + set current values + + + + start with template: default.med + + + + show splash screen + + + + use JACK freewheel mode if possible + + + + Mixer 1 + + + + Mixer 2 + + + + + MITTransposeBase + + MusE: Midi Input Plugin: Transpose + + + + On + Вкл + + + TriggerKey + + + + Transpose: + + + + +0 + + + + + MPConfig + + none + ничего + + + Port + Порт + + + GUI + GUI + + + Instrument + Инструмент + + + Device Name + Имя устройства + + + State + Состояние + + + unknown + неизвестно + + + I + I + + + O + O + + + + MRConfigBase + + MusE: Midi Input Plugin: Remote Control + MusE: Входной MIDI-модуль: Дистан. управление + + + Activate + Активировать + + + On + Вкл + + + Actions + Действия + + + Stop + Остановить + + + Record + Записать + + + Goto Left Mark + Перейти к левой метке + + + Play + Воспроизвести + + + + MidiController + + Velocity + Сила нажатия + + + + MidiControllerEditDialogBase + + MusE: Define Midi Controller + MusE: Назначить MIDI-контроллер + + + Name + Имя + + + Type + Тип + + + H-Ctrl + H-Ctrl + + + L-Ctrl + L-Ctrl + + + Min Val + Мин знач + + + Max Val + Макс знач + + + list of defined controllers + список назначенных контроллеров + + + This is the MusE list of defined controllers. + Это список назначенных в MusE контроллеров. + + + Properties + Свойства + + + Name + Имя + + + Max Value + Макс значение + + + Min Value + Мин значение + + + Control7 + Control7 + + + Control14 + Control14 + + + RPN + RPN + + + NRPN + NRPN + + + Type + Тип + + + create new entry + создать новую запись + + + pressing the New button you create a new entry +in the MusE list of defined controllers + По нажатию кнопки "Новая" создаётся новая +запись в список назначенных в MusE контроллеров + + + &Delete + У&далить + + + delete selected entry + удалить выделенное событие + + + &OK + &OK + + + &Cancel + О&тменить + + + Channel + Канал + + + Pitch + Высота тона + + + Range + Область + + + &Add + &Добавить + + + Alt+A + Alt+A + + + Predefined Controller: + Предопределённый контроллер: + + + Managed Controller for Port + + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + + + + Program + Программа + + + Midi Controller Number High Byte + + + + Midi Controller Number Low Byte + + + + + MidiFilterConfigBase + + MusE: Midi Input Filter + MusE: Фильтр входящих MIDI-событий + + + Record Filter + Фильтр записи + + + Note On + Note On + + + Poly Pressure + Полифоническое послекасание + + + Controller + Контроллер + + + Program Change + Смена программы + + + After Touch + Послекасание + + + Pitch Bend + Смена высоты звука + + + Sysex + SysEx + + + Thru Filter + Thru-фильтр + + + Controller Filter + Фильтр контроллеров + + + Channel Filter + Фильтр каналов + + + 14 + 14 + + + 10 + 10 + + + 6 + 6 + + + 12 + 12 + + + 4 + 4 + + + 2 + 2 + + + 9 + 9 + + + 8 + 8 + + + 3 + 3 + + + 13 + 13 + + + 15 + 15 + + + 16 + 16 + + + 7 + 7 + + + 11 + 11 + + + 5 + 5 + + + 1 + 1 + + + &Cancel + О&тменить + + + + MidiInputTransformDialogBase + + MusE: Midi Input Transformator + MusE: Преобразование входящих MIDI-сообщений + + + Filter + Фильтр + + + All + Все + + + Equal + Равно + + + Unequal + Не равно + + + Note + Нота + + + Poly Pressure + Полифоническое послекасание + + + Control Change + Смена контроллера + + + Aftertouch + Послекасание + + + Pitch Bend + Смена высоты звука + + + NRPN + NRPN + + + RPN + RPN + + + Value 2 + Значение 2 + + + Value 1 + Значение 1 + + + Event Type + Тип события + + + Ignore + Игнорировать + + + Higher + Выше + + + Lower + Ниже + + + Inside + Внутри + + + Outside + Снаружи + + + Channel + Канал + + + Port + Порт + + + Processing + Идёт обработка + + + Keep + Сохранить + + + Fix + Поправить + + + Plus + Плюс + + + Minus + Минус + + + Multiply + Умножить + + + Divide + Разделить + + + Invert + Инвертировать + + + Random + Случайно + + + Modules + Модули + + + 1 + 1 + + + 2 + 2 + + + 3 + 3 + + + 4 + 4 + + + enable modul 1 + разрешить модуль 1 + + + enable modul 2 + разрешить модуль 2 + + + enable modul 3 + разрешить модуль 3 + + + enable modul 4 + разрешить модуль 4 + + + Preset + Предустановка + + + Name: + Имя: + + + Comment: + Комментарий: + + + Function + Функция + + + &New + &Новый + + + create new preset + создать новую предустановку + + + &Delete + &Удалить + + + delete preset + удалить предустановку + + + &Dismiss + &Пропустить + + + PresetList + Список предустановок + + + + MidiPortRouteBase + + Input + Вход + + + MusE: Midi Port Routing + MusE: Маршруты между MIDI-портами + + + Port 2 + Порт 2 + + + Output + Выход + + + + MidiSyncConfigBase + + MusE: Midi Sync + + + + Sync Mode + + + + Master + Мастер + + + Slave + + + + Sync Source + + + + accept MTC + + + + accept Midi Clock + + + + accept MMC + + + + Id: + + + + device id + + + + Sync Gen + + + + Midi Time Code (MTC) + + + + Midi Clock + + + + Midi Machine Control (MMC) + + + + Apply + Применить + + + Ok + + + + Cancel + Отменить + + + MTC + + + + Type: + + + + 24 + 24 + + + 25 + 25 + + + 30D + + + + 30N + + + + Offset: + Смещение: + + + hour + + + + h + + + + minute + + + + m + + + + second + + + + s + + + + frame + + + + f + + + + subframe + + + + + MidiTrackInfoBase + + MusE: TrackInfo + + + + Output Channel + + + + all midi events are send to this output channel + + + + Track Info + + + + % + % + + + Modify Note Length + + + + Track Name + + + + Output Port + + + + OCh. + + + + off + выкл + + + Track Delay (ticks) + + + + Compress Note Velocity + + + + Pitch Transpose + + + + Transp. + + + + Delay + + + + Compr. + + + + Velocity + Сила нажатия + + + Modify Note Velocity + + + + Length + + + + Input Ports + + + + IChan. + + + + Input Channels + + + + 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 + + + + Channel Info + + + + ??? + + + + Select Instrument Patch + + + + Bank Select LSB + + + + Bank Select MSB + + + + H-Bank + + + + Instrument High Bank + + + + L-Bank + + + + Instrument Low Bank + + + + Progr. + + + + Instrument/Program/Patch + + + + + MidiTransformDialogBase + + MusE: Midi Transformator + + + + &New + &Новый + + + &Delete + + + + &Apply + &Применить + + + &OK + + + + &Cancel + О&тменить + + + PresetList + Список предустановок + + + Processing + Идёт обработка + + + Event Type + Тип события + + + Keep + Сохранить + + + Fix + Поправить + + + Note + Нота + + + Poly Pressure + Полифоническое послекасание + + + Control Change + Смена контроллера + + + Aftertouch + Послекасание + + + Pitch Bend + Смена высоты звука + + + NRPN + NRPN + + + RPN + RPN + + + Plus + Плюс + + + Minus + Минус + + + Multiply + Умножить + + + Divide + Разделить + + + Value 2 + Значение 2 + + + Invert + Инвертировать + + + ScaleMap + + + + Flip + + + + Dyn + + + + Random + Случайно + + + Value 1 + Значение 1 + + + Length + + + + Position + + + + Filter + Фильтр + + + All + Все + + + Equal + Равно + + + Unequal + Не равно + + + Sysex + SysEx + + + Meta + + + + Ignore + Игнорировать + + + Higher + Выше + + + Lower + Ниже + + + Inside + Внутри + + + Outside + Снаружи + + + Bar Range + + + + Preset + Предустановка + + + Name: + Имя: + + + Comment: + Комментарий: + + + Range + Область + + + process all events + + + + selected tracks + + + + inside loop + + + + Function + Функция + + + Select + Выделить + + + Quantize + + + + Delete + + + + Transform + + + + Insert + + + + Copy + Скопировать + + + Extract + + + + Quantize Value + + + + + MidiTransformerDialog + + New + Новый + + + + MixdownFileDialogBase + + MusE: Set Mixdown Wavefile + + + + &OK + + + + &Cancel + О&тменить + + + File Path + + + + Channel + Канал + + + Stereo + Стерео + + + Mono + Моно + + + 5.1 + 5.1 + + + wav,16 Bit + + + + wav, 24 Bit + + + + wav, 32 Bit (float) + + + + Format + + + + + MusE + + Import Wave File + Импортировать WAV-файл + + + UndoRedo + + + + undo + отменить + + + Und&o + &Отменить + + + redo + повторить + + + Re&do + &Повторить + + + undo last change to song + отменить последнее изменение композиции + + + redo last undo + повторить последнюю отмену + + + Transport + Пульт управления + + + loop + цикл + + + Loop + Цикл + + + punchin + Начало врезки + + + Punchin + Начало врезки + + + punchout + Конец врезки + + + Punchout + Конец врезки + + + start + к началу + + + Start + К началу + + + rewind + перемотать назад + + + Rewind + Перемотать назад + + + forward + перемотать вперёд + + + Forward + Перемотать вперёд + + + stop + остановить + + + Stop + Остановить + + + play + воспроизвести + + + Play + Воспроизвести + + + record + записать + + + Record + Записать + + + panic + + + + Panic + + + + new + новый + + + &New + &Новый + + + open + открыть + + + &Open + &Открыть + + + save + сохранить + + + &Save + &Сохранить + + + pianoroll + pianoroll + + + Pianoroll + Pianoroll + + + Marker + Маркер + + + File Buttons + Файловые кнопки + + + &File + &Файл + + + Open &Recent + Открыть из &недавних + + + Save &As + Сохранить &как + + + Import Midifile + Импортировать MIDI-файл + + + Export Midifile + Экспортировать MIDI-файл + + + &Quit + Вы&йти + + + &Edit + &Правка + + + C&ut + &Вырезать + + + &Copy + С&копировать + + + &Paste + &Вставить + + + Add Track + Добавить дорожку + + + Select &All + Выделить &всё + + + &Deselect All + &Убрать выделение + + + Invert &Selection + Обратить в&ыделение + + + &Inside Loop + &Внутри цикла + + + &Outside Loop + &Снаружи цикла + + + All &Parts on Track + Все &части в дорожке + + + Select + Выделить + + + Drums + Ударные + + + List + Список + + + Graphic + Графика + + + Mastertrack + Мастер-дорожка + + + Midi &Transform + &Преобразовать MIDI-сообщения + + + Modify Gate Time + Изменить время звучания + + + Modify Velocity + Изменить скорость + + + Crescendo + Крещендо + + + Transpose + Транспонировать + + + Thin Out + Удалить дубли + + + Erase Event + Удалить событие + + + Note Shift + Сдвиг ноты + + + Move Clock + + + + Copy Measure + Скопировать деление + + + Erase Measure + Стереть деление + + + Delete Measure + Удалить деление + + + Create Measure + Создать деление + + + Mix Track + Свести дорожку + + + Midi + MIDI + + + &Structure + &Структура + + + Global Cut + Глобальное вырезание + + + Global Insert + Глобальная вставка + + + Global Split + Глобальное разделение + + + Copy Range + Скопировать область + + + Cut Events + Вырезать события + + + Transport Panel + Панель пульта управления + + + Bigtime window + Окно хронометра + + + dont follow Song + не следовать за композицией + + + follow page + следовать постранично + + + follow continuous + следовать плавно + + + Global Settings + Общие настройки + + + follow song + следовать за композицией + + + Metronome + Метроном + + + Midi Sync + MIDI-синхронизация + + + Appearance settings + Настройки облика + + + Midi Input Transform + Преобразование входящих MIDI-сообщений + + + Midi Input Filter + Фильтр входящих MIDI-событий + + + Midi Remote Control + Дистанционное управление MIDI + + + Random Rhythm Generator + Генератор случайного ритма + + + &Midi + &MIDI + + + Mixer + Микшер + + + Input Plugins + Модули на входе + + + Reset Instr. + Перегрузить инструменты + + + Init Instr. + Запустить инструменты + + + local off + откл. локальное управление + + + &Audio + &Звук + + + Bounce to Track + Свести в дорожку + + + Bounce to File + Свести в файл + + + &Help + &Помощь + + + About&Qt + О &Qt + + + Unknown File Format + Неизвестный формат файла + + + MusE: load project + MusE: Открыть проект + + + MusE: Write File failed + MusE: Попытка записать файл провалилась + + + The current Project contains unsaved data +Save Current Project? + Текущий проект содержит не сохранённые данные. +Сохранить текущий проект? + + + &Nosave + &Не сохранять + + + &Abort + &Прервать + + + MusE: Save As + MusE: Сохранить как + + + MusE: Song: + MusE: Песня: + + + MusE: Import Midi + MusE: Импортировать MIDI + + + MusE: Export Midi + MusE: Экспортировать MIDI + + + reading midifile + + читается MIDI-файл + + + + Nothing to edit + Нечего редактировать + + + MusE: Copy Range + MusE: Скопировать область + + + not implemented + не реализовано + + + MusE: Cut Events + MusE: Вырезать события + + + MusE: Bounce to Track + MusE: Сведение в дорожку + + + more than one target track selected + выбрано больше одной конечной дорожки + + + wrong target track type, +select wave track as target + это неправильный тип конечной дорожки, +выберите звуковую дорожку + + + no target track selected + конечная дорожка не выбрана + + + The current Project contains unsaved data +Load overwrites current Project: +Save Current Project? + Текущий проект содержит не сохранённые данные. +Загрузка нового проекта приведёт к перезаписи данных этого. +Сохранить текущий проект? + + + &Overwrite + Пере&записать + + + no help found at: + справка не найдена в: + + + MusE: Open Help + MusE: Открыть справку + + + Midi Ports / Soft Synth + MIDI-порты / Прогр. синтезаторы + + + Delete Selected Tracks + Выбранные дорожки удалены + + + View + Вид + + + Edit Instrument + Изменить инструмент + + + Restart Audio + Перезапустить звуковой движок + + + Take Snapshot + Сделать снимок + + + Settings + Настройки + + + Configure shortcuts + Настроить горячие клавиши + + + Midi File Export + Экспорт в MIDI-файл + + + &Manual + &Руководство + + + &MusE homepage + Домашняя &страница MusE + + + &Report Bug... + Сообщить о&б ошибке... + + + &About MusE + &О MusE + + + What's &This? + &Что это? + + + Cannot read template + Невозможно прочитать шаблон + + + File open error + Ошибка при открытии файла + + + File read error + Ошибка при чтении файла + + + MusE: load template + MusE: Загрузка шаблона + + + MusE: Bounce + MusE: Сведение + + + set left/right marker for bounce range + установите левый и правый маркеры для указания области сведения + + + MusE: Bounce to File + MusE: Сведение в файл + + + no output track found + не найдено ни одной дорожки выхода + + + Add midi file to current project? + + Добавить MIDI-файл в текущий проект? + + + + &Add to Project + &Добавить в проект + + + &Replace + &Заменить + + + +failed: + +не удалось: + + + Arranger + Компоновщик + + + Cursor + Курсор + + + Off + Выкл + + + Bar + Такт + + + Snap + Привязка + + + Len + Длн + + + Type + Тип + + + NO + НЕТ + + + GM + GM + + + GS + GS + + + XG + XG + + + midi song type + тип MIDI-композиции + + + Pitch + Высота тона + + + midi pitch + midi высота тона + + + global midi pitch shift + + + + Tempo + Темп + + + midi tempo + MIDI-темп + + + N + + + + MusE: Create tmp file failed + MusE: Попытка создать временный файл провалилась + + + &View + + + + Mixer 1 + + + + Mixer 2 + + + + Setti&ngs + + + + + OrganGuiBase + + MusE: Organ + + + + Drawbars + + + + 16' + + + + 4' + + + + 2 2/3' + + + + 2' + + + + 5 1/3' + + + + 8' + + + + Envelope Hi + + + + Release + + + + Sustain + + + + Decay + + + + Attack + + + + ms + + + + cB + + + + Envelope Lo + + + + O-1 + + + + Oscillator + + + + Brass + + + + Reed + + + + Flute + + + + Velocity + Сила нажатия + + + + PatchBayBase + + ALSA Patch Bay + ALSA Patch Bay + + + + PluginDialog + + MusE: select plugin + MusE: выбрать модуль + + + Lib + Библ. + + + Label + Метка + + + Name + Имя + + + AI + AI + + + AO + AO + + + CI + CI + + + CO + CP + + + IP + IP + + + id + id + + + Maker + Создатель + + + Copyright + Авторское право + + + Ok + Ok + + + Cancel + Отменить + + + Select which types of plugins should be visible in the list,<br>beware that 'all' includes plugins that probably are not usable by MusE. + Выберите ти модулей, которые будут видны в списке,<br>помните, что "все" включит в список модули, которые <br> +могут быть непригодны для MusE. + + + Stereo and Mono + Стерео и моно + + + Stereo + Стерео + + + Mono + Моно + + + All + Все + + + 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. + + + + + PluginGui + + File Buttons + Файловые кнопки + + + Load Preset + Загрузить предустановку + + + Save Preset + Сохранить предустановку + + + bypass plugin + обойти модуль + + + MusE: load preset + MusE: загрузить предустановку + + + MusE: save preset + MusE: сохранить предустановку + + + + QHeader + + Port Number + Номер порта + + + enable gui for device + разрешить GUI для устройства + + + Name of the midi device associated with this port number + Имя MIDI-устройства, ассоциированного с номером этого порта + + + Instrument connected to port + Инструмент, подсоединённый к этому порту + + + State: result of opening the device + Состояние: результат открытия устройства + + + enables reading from device + разрешает чтение с устройства + + + enables writing to device + разрешает запись на устройство + + + + QPopupMenu + + Add Soft Synth + Добавить программный синтезатор + + + Add Midi Generator... + + + + Add Soft Synth... + + + + + QWidget + + new + новый + + + File + + Файл + + + +exists + (new line) +существует + + + MusE: write + MusE: записать + + + Overwrite + Перезаписать + + + Quit + Выйти + + + None + Ничего + + + + RhythmBase + + MusE: Random Rhythm Generator + MusE: Генератор случайного ритма + + + Instrument Properties + Свойства инструмента + + + test + тест + + + contrib + внести + + + randomize + перемешать + + + Group 1 + Группа C + + + Group 2 + Группа 2 + + + Group 3 + Группа 3 + + + Group 4 + Группа 4 + + + Group 5 + Группа 5 + + + listen + прослушать + + + Instrument + Инструмент + + + Group + Группа + + + &New + &Новый + + + create new entry + создать новую запись + + + pressing the New button you create a new entry +in the MusE list of defined controllers + По нажатию кнопки "Новая" создаётся новая +запись в список назначенных в MusE контроллеров + + + &Delete + У&далить + + + delete selected entry + удалить выделенное событие + + + Up + Вверх + + + Down + Вниз + + + Instrument + Инструмент + + + list of defined controllers + список назначенных контроллеров + + + This is the MusE list of defined controllers. + Это список назначенных контроллеров для MusE + + + &File + &Файл + + + &Edit + &Правка + + + &Help + П&омощь + + + Tools + Сервис + + + New + Новый + + + Open + Открыть + + + &Open... + &Открыть... + + + Save + Сохранить + + + &Save + &Сохранить + + + Save As + Сохранить как + + + Save &As... + Сохранить &как... + + + Print + Напечатать + + + &Print... + &Печать... + + + Exit + Выйти + + + E&xit + В&ыйти + + + Undo + Отменить + + + &Undo + &Отменить + + + Redo + Повторить + + + &Redo + П&овторить + + + Cut + Вырезать + + + &Cut + &Вырезать + + + Copy + Скопировать + + + C&opy + С&копировать + + + Paste + Вставить + + + &Paste + &Вставить + + + Find + Найти + + + &Find... + &Найти... + + + Contents + Содержание + + + &Contents... + &Содержание... + + + Index + Индекс + + + &Index... + &Индекс... + + + About + О программе + + + &About... + &О программе... + + + <b>Notice!</b><br> +Random Rhythm Generator is not enabled yet! + <b>Внимание!</b><br> +Случайный генератор ритма пока ещё не работает! + + + Ctrl+N + Ctrl+N + + + Ctrl+O + Ctrl+O + + + Ctrl+S + Ctrl+S + + + Ctrl+P + Ctrl+P + + + Ctrl+Z + Ctrl+Z + + + Ctrl+Y + Ctrl+Y + + + Ctrl+X + Ctrl+X + + + Ctrl+C + Ctrl+C + + + Ctrl+V + Ctrl+V + + + Ctrl+F + Ctrl+F + + + + RouteDialogBase + + MusE: Routing + MusE: Маршруты + + + Add Route + Добавить маршрут + + + Source: + Источник: + + + Destination: + Назначение: + + + Connect + Соединить + + + connect source to destination + соединить источник с местом назначения + + + Current Routes + Текущие маршруты + + + Source + Источник + + + Destination + Назначение + + + Remove + Удалить + + + remove selected route + удалить текущий маршрут + + + + SS_PluginChooserBase + + SimpleDrums - Ladspa Plugin Chooser + + + + Name + Имя + + + Label + Метка + + + Inports + + + + Outports + + + + Creator + + + + &Cancel + О&тменить + + + Alt+C + + + + &OK + + + + Alt+O + + + + + ShortcutCaptureDialogBase + + Enter shortcut sequence + + + + Press keys to enter shortcut sequence! + + + + Old shortcut: + + + + Undefined + + + + New shortcut: + + + + OK + ОК + + + Cancel + Отменить + + + + ShortcutConfig + + Global + Глобально + + + Arranger + Компоновщик + + + Pianoroll + Pianoroll + + + Drumeditor + + + + List editor + + + + List Mastertrack + + + + All categories + + + + Transport: Start playback from current location + + + + Transport: Toggle metronome + + + + Transport: Stop Playback + + + + Transport: Play, Stop, Rewind + + + + Transport: Goto left marker + + + + Transport: Goto right marker + + + + Transport: Toggle Loop section + + + + Transport: Toggle Record + + + + Edit: Copy + + + + Edit: Undo + + + + Edit: Redo + + + + Edit: Cut + + + + Edit: Paste, + + + + Edit: Delete + + + + File: New project + + + + File: Open from disk + + + + File: Save project + + + + File: Open recent file + + + + File: Save as + + + + File: Load template + + + + File: Import midi file + + + + File: Export midi file + + + + File: Import audio file + + + + File: Quit MusE + + + + Edit: Select parts on track + + + + Open pianoroll + + + + Open drumeditor + + + + Open listeditor + + + + Open graphical mastertrack editor + + + + Open list mastertrack editor + + + + Open midi transformer + + + + Add midi track + + + + Add drum track + + + + Add wave track + + + + Add audio output + + + + Add audio group + + + + Add audio input + + + + Add audio aux + + + + Structure: Global cut + + + + Structure: Global insert + + + + Structure: Global split + + + + Structure: Copy range + + + + Structure: Cut events + + + + View: Open mixer window + + + + View: Toggle transport window + + + + View: Toggle bigtime window + + + + View: Open marker window + + + + Settings: Follow song by page + + + + Settings: Follow song off + + + + Settings: Follow song continuous + + + + Settings: Global configuration + + + + Settings: Configure shortcuts + + + + Settings: Configure metronome + + + + Settings: Midi sync configuration + + + + Settings: Midi file export configuration + + + + Settings: Appearance settings + + + + Settings: Midi ports / Soft Synth + + + + Settings: Audio subsystem configuration + + + + Midi: Edit midi instruments + + + + Midi: Open midi input transform + + + + Midi: Open midi input filter + + + + Midi: Midi input transpose + + + + Midi: Midi remote control + + + + Midi: Random rhythm generator + + + + Midi: Reset midi + + + + Midi: Init midi + + + + Midi: Midi local off + + + + Audio: Bounce audio to track + + + + Audio: Bounce audio to file + + + + Audio: Restart audio + + + + Automation: Mixer automation + + + + Automation: Take mixer snapshot + + + + Automation: Clear mixer automation + + + + Help: Open Manual + + + + Help: Toggle whatsthis mode + + + + Edit: Edit selected part + + + + Edit: Select nearest part on track above + + + + Edit: Add nearest part on track above + + + + Edit: Select nearest part on track below + + + + Edit: Add nearest part on track below + + + + Midi: Transpose + + + + Edit: Select all + + + + Edit: Select none + + + + Edit: Invert selection + + + + Edit: Select events/parts inside locators + + + + Edit: Select events/parts outside locators + + + + Edit: Select nearest part/event to the left + + + + Edit: Add nearest part/event to the left to selection + + + + Edit: Add nearest part/event to the right to selection + + + + Edit: Set locators to selection + + + + Edit: Increase pitch + + + + Edit: Decrease pitch + + + + Edit: Set fixed length on midi events + + + + Quantize: Over Quantize + + + + Quantize: Note On Quantize + + + + Quantize: Note On/Off Quantize + + + + Quantize: Iterative Quantize + + + + Quantize: Configure quant + + + + Quantize: Modify Gate Time + + + + Quantize: Modify Velocity + + + + Edit: Crescendo + + + + Edit: Thin Out + + + + Edit: Erase Event + + + + Edit: Note Shift + + + + Edit: Move Clock + + + + Edit: Copy Measure + + + + Edit: Erase Measure + + + + Edit: Delete Measure + + + + Edit: Create Measure + + + + Edit: Change event color + + + + Tool: Pointer + + + + Tool: Pencil + + + + Tool: Eraser + + + + Tool: Line Draw + + + + Tool: Scissor + + + + Tool: Glue + + + + Tool: Mute + + + + Transport: Increase current position + + + + Transport: Decrease current position + + + + Quantize: Set quantize to 1/1 note + + + + Quantize: Set quantize to 1/2 note + + + + Quantize: Set quantize to 1/4 note + + + + Quantize: Set quantize to 1/8 note + + + + Quantize: Set quantize to 1/16 note + + + + Quantize: Set quantize to 1/32 note + + + + Quantize: Set quantize to 1/64 note + + + + Quantize: Toggle triol quantization + + + + Quantize: Toggle punctuation quantization + + + + Quantize: Toggle punctuation quantization (2) + + + + Edit: Insert at location + + + + Insert Note + Вставить ноту + + + Insert SysEx + Вставить SysEx + + + Insert Ctrl + Вставить контроллер + + + Insert Meta + Вставить Meta + + + Insert Channel Aftertouch + Вставить Channel Aftertouch + + + Insert Key Aftertouch + Вставить Key Aftertouch + + + Edit: Increase event position + + + + Edit: Decrease event position + + + + Insert Tempo + + + + Insert Signature + + + + Change Event Position + + + + Edit Event Value + + + + + ShortcutConfigBase + + Configure Keyboard Shortcuts + + + + Shortcut Category + + + + Description + + + + Shortcut + + + + &Clear + + + + Alt+C + + + + &Define + + + + Alt+D + Alt+D + + + &Apply + &Применить + + + Alt+A + Alt+A + + + + SimpleDrumsGuiBase + + DrumSynth 0.1 + + + + + TempoSig + + Tempo/Sig + Темп/Знаки альтерации + + + + Transport + + Overdub + Наложить + + + Replace + Заменить + + + Rec Mode + Режим записи + + + Normal + Норм. + + + Mix + Смешать + + + Cycle Rec + Циклич. запись + + + punchin + нач. врезки + + + loop + цикл + + + punchout + кнц. врезки + + + Punch In + Начало врезки + + + Loop + Цикл + + + Punch Out + Конец врезки + + + Left Mark + Левый маркер + + + Right Mark + Правый маркер + + + rewind to start + перемотать к началу + + + rewind + перемотать назад + + + forward + перемотать вперёд + + + stop + остановить + + + play + воспроизвести + + + record + записать + + + AC + AC + + + quantize during record + квантовать при записи + + + Click + Метр. + + + metronom click on/off + Щелчки метронома + + + Sync + Синхр. + + + external sync on/off + Вкл/выкл внешнюю синхронизацию + + + Master + Мастер + + + use master track + использовать мастер-дорожку + + + + TransposeDialogBase + + MusE: Midi Transpose + + + + Value + Значение + + + halftones + + + + Time + + + + all + + + + between markers + + + + Parts + Части + + + all in selected tracks + + + + OK + ОК + + + Cancel + Отменить + + + + VelocityBase + + MusE: Modify Velocity + + + + Range + Область + + + All Events + Все события + + + Selected Events + Выбранные события + + + Looped Events + События в цикле + + + Selected & Looped + Выбранные и в цикле + + + Values + Значения + + + Rate: + Частота: + + + Offset: + Смещение: + + + % + % + + + OK + ОК + + + Cancel + Отменить + + + + WaveTrackInfoBase + + MusE: TrackInfo + + + + Track Info + + + + Track Name + + + + off + выкл + + + Track Delay (ticks) + + + + Delay + + + + Delay (Frames) + + + + 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 Binary files /dev/null and b/muse/share/locale/muse_sv_SE.qm 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 @@ + + + + + Click this button to enable recording + Klicka här för att spela in + + + sets amount of quantization: +0 - no quantization +100 - full quantization + Sätter mängden kvantisering: +0 - ingen kvantisering +100 - full kvantisering + + + select Pointer Tool: +with the pointer tool you can: + select parts + move parts + copy parts + välj pek-verktyg: +med pekverktyget kan du: + välja parter + flytta parter + kopiera parter + + + Transport: Start playback from current location + Transport: Starta uppspelning från nuvarande position + + + Transport: Toggle metronome + Transport: Metronom av/på + + + Transport: Stop Playback + Transport: Stoppa uppspelning + + + Transport: Play, Stop, Rewind + Transport: Spela, stoppa, spola tillbaka + + + Transport: Goto left marker + Transport: Gå till vänster markering + + + Transport: Goto right marker + Transport: Gå till höger markering + + + Transport: Toggle Loop section + Transport: Loopa sektion av/på + + + Transport: Toggle Record + Transport: Inspelning av/på + + + Edit: Copy + Redigera: Kopiera + + + Edit: Undo + Redigera: Ångra + + + Edit: Redo + Redigera: Gör om + + + Edit: Cut + Redigera: Klipp ut + + + Edit: Paste, + Redigera: Klistra in + + + Edit: Delete + Redigera: Ta bort + + + File: New project + Arkiv: Nytt projekt + + + File: Open from disk + Arkiv: Öppna + + + File: Save project + Arkiv: Spara + + + File: Open recent file + Arkiv: Öppna föregående fil + + + File: Save as + Arkiv: Spara som + + + File: Load template + Arkiv: Ladda mall + + + File: Import midi file + Arkiv: Importera midifil + + + File: Export midi file + Arkiv: Exportera midifil + + + File: Import audio file + Arkiv: Importera ljudfil + + + File: Quit MusE + Arkiv: Avsluta + + + Edit: Select parts on track + Arkiv: Välj alla parter i spår + + + Open pianoroll + Öppna pianorulle + + + Open drumeditor + Öppna trumeditor + + + Open listeditor + Öppna listeditor + + + Open graphical mastertrack editor + Öppna masterspår-editor (grafisk) + + + Open list mastertrack editor + Öppna masterspår-editor (lista) + + + Open midi transformer + Öppna miditransformer + + + Add midi track + Lägg till midispår + + + Add drum track + Lägg till trumspår + + + Add wave track + Lägg till ljudspår + + + Add audio output + Lägg till ljudutgång + + + Add audio group + Lägg till ljudgrupp + + + Add audio input + Lägg till ljudingång + + + Add audio aux + Lägg till aux + + + Structure: Global cut + Struktur: Globalt klipp + + + Structure: Global insert + Struktur: Global insättning + + + Structure: Global split + Struktur: Global delning + + + Structure: Copy range + Struktur: Kopiera område + + + Structure: Cut events + Struktur: Klipp ut händelse + + + View: Open mixer window + Vy: Öppna mixerfönster + + + View: Toggle transport window + Vy: Transportfönster av/på + + + View: Toggle bigtime window + Vy: Bigtimefönster av/på + + + View: Open marker window + Vy: Öppna markörfönster + + + Settings: Follow song by page + Inställningar: Följ sång efter sida + + + Settings: Follow song off + Inställningar: Följ sång av + + + Settings: Follow song continuous + Inställningar: Följ sång kontinuerligt + + + Settings: Global configuration + Inställningar: Globala inställningar + + + Settings: Configure shortcuts + Inställningar: Konfigurera tangentbordsgenvängar + + + Settings: Configure metronome + Inställningar: Konfigurera metronom + + + Settings: Midi sync configuration + Inställningar: Midi synk konfigurationg + + + Settings: Midi file export configuration + Inställningar: Midi fil export-konfiguration + + + Settings: Appearance settings + Inställningar: Utseendeinställningar + + + Settings: Midi ports / Soft Synth + Inställningar: Midiportar / Mjukvarusynthar + + + Settings: Audio subsystem configuration + Inställningar: Konfiguration av ljud-undersystem + + + Midi: Edit midi instruments + Midi: Editera midi-instrument + + + Midi: Open midi input transform + Midi: Öppna midi inputtransformator + + + Midi: Open midi input filter + Midi: Öppna midi indatafilter + + + Midi: Midi input transpose + Midi: Midi indata transponering + + + Midi: Midi remote control + Midi: Midi fjärrkontroll + + + Midi: Random rhythm generator + Midi: Slumprymtmgenerator + + + Midi: Reset midi + Midi: Resetta midi + + + Midi: Init midi + Midi: Initiera midi + + + Midi: Midi local off + Midi: Midi lokal av + + + Audio: Bounce audio to track + Audio: Bounce till spår + + + Audio: Bounce audio to file + Audio: Bounce till fil + + + Audio: Restart audio + Audio: Starta om audio + + + Automation: Mixer automation + Audio: Mixerautomation + + + Automation: Take mixer snapshot + Audio: Mixer ögonblicksbild + + + Automation: Clear mixer automation + Audio: Rensa mixerautomation + + + Help: Open Manual + Hjälp: Öppna manual + + + Help: Toggle whatsthis mode + Hjälp: What's this-läge av/på + + + Edit: Edit selected part + Redigera: Editera vald part + + + Edit: Select nearest part on track above + Redigera: Välj närmsta part på ovanstående spår + + + Edit: Add nearest part on track above + Redigera: Lägg till närmsta part på ovanstående spår till val + + + Edit: Select nearest part on track below + Redigera: Välj närmsta part på underliggande spår + + + Edit: Add nearest part on track below + Redigera: Lägg till närmsta part på underliggande spår till val + + + Midi: Transpose + Midi: Transponering + + + Edit: Select all + Redigera: Välj alla + + + Edit: Select none + Redigera: Välj ingen + + + Edit: Invert selection + Redigera: Invertera val + + + Edit: Select events/parts inside locators + Redigera: Välj händelser/parter inom sektion + + + Edit: Select events/parts outside locators + Redigera: Välj händelser/parter utanför sektion + + + Edit: Select nearest part/event to the left + Redigera: Välj närmsta part/händelse till vänster + + + Edit: Add nearest part/event to the left to selection + Redigera: Lägg till närmsta part/händelse till vänster till val + + + Edit: Add nearest part/event to the right to selection + Redigera: Lägg till närmsta part/händelse till höger till val + + + Edit: Set locators to selection + Redigera: Sätt loopsektion till valda parter/händelser + + + Edit: Increase pitch + Redigera: Höj pitch + + + Edit: Decrease pitch + Redigera: Sänk pitch + + + Edit: Set fixed length on midi events + Redigera: Sätt fix längd till valda midihändelser + + + Quantize: Over Quantize + Redigera: Överkvantisera + + + Quantize: Note On Quantize + Kvantisering: Not på-kvantisering + + + Quantize: Note On/Off Quantize + Kvantisering: Not på/av-kvantisering + + + Quantize: Iterative Quantize + Kvantisering: Iterativ kvantisering + + + Quantize: Configure quant + Kvantisering: Konfigurera kvantisering + + + Quantize: Modify Gate Time + Kvantisering: Modifiera gate-tid + + + Quantize: Modify Velocity + Kvantisering: Modifiera velocity + + + Edit: Crescendo + Redigera: Crescendo + + + Edit: Thin Out + Redigera: Tunna ut + + + Edit: Erase Event + Redigera: Ta bort händelse + + + Edit: Note Shift + Redigera: Shifta Not + + + Edit: Move Clock + Redigera: Flytta Klocka + + + Edit: Copy Measure + Redigera: Kopiera Takt + + + Edit: Erase Measure + Redigera: Ta bort Takt + + + Edit: Delete Measure + Redigera: Ta bort Takt + + + Edit: Create Measure + Redigera: Lägg till Takt + + + Edit: Change event color + Redigera: Ändra färg på händelse + + + Tool: Pointer + Verktyg: Pekare + + + Tool: Pencil + Verktyg: Penna + + + Tool: Eraser + Verktyg: Radergummi + + + Tool: Line Draw + Verktyg: Rita linje + + + Tool: Scissor + Verktyg: Delare + + + Tool: Glue + Verktyg: Lim + + + Tool: Mute + Verktyg: Tysta + + + Transport: Increase current position + Transport: Öka nuvarande position + + + Transport: Decrease current position + Transport: Minska nuvarande position + + + Quantize: Set quantize to 1/1 note + Kvantisering: Sätt kvantisering till 1/1-not + + + Quantize: Set quantize to 1/2 note + Kvantisering: Sätt kvantisering till 1/2-not + + + Quantize: Set quantize to 1/4 note + Kvantisering: Sätt kvantisering till 1/4-not + + + Quantize: Set quantize to 1/8 note + Kvantisering: Sätt kvantisering till 1/8-not + + + Quantize: Set quantize to 1/16 note + Kvantisering: Sätt kvantisering till 1/16-not + + + Quantize: Set quantize to 1/32 note + Kvantisering: Sätt kvantisering till 1/32-not + + + Quantize: Set quantize to 1/64 note + Kvantisering: Sätt kvantisering till 1/64-not + + + Quantize: Toggle triol quantization + Kvantisering: Växla triol-kvantisering + + + Quantize: Toggle punctuation quantization + Kvantisering: Växla punktuerad kvantisering + + + Quantize: Toggle punctuation quantization (2) + Kvantisering: Växla punktuerad kvantisering (2) + + + Edit: Insert at location + Redigera: Sätt in på nuvarande position + + + Insert Note + Mata in Not + + + Insert SysEx + Mata in SysEx + + + Insert Ctrl + Mata in Ctrl + + + Insert Meta + Mata in Meta + + + Insert Channel Aftertouch + Mata in Aftertouch för kanal + + + Insert Key Aftertouch + Mata in Key Aftertouch + + + Edit: Increase event position + Redigera: Öka position för händelse + + + Edit: Decrease event position + Redigera: Minska position för händelse + + + Insert Tempo + Mata in Tempo + + + Insert Signature + Mata in tempo-signatur + + + Change Event Position + Ändra position för händelse + + + Edit Event Value + Redigera värde för händelse + + + + @default + + Click this button to stop playback + Klicka här för att stoppa uppspelning + + + Click this button to start playback + Klicka här för att starta uppspelning + + + Click this button to rewind to start position + Klicka här för att spola tillbaks till början + + + Click this button to rewind + Klicka här för att flytta markören bakåt + + + Click this button to forward current play position + Klicka här för att flytta markören framåt + + + don't quantize notes above this tick limit + Kvantisera inte över denna tick gräns + + + quantize also note len as default + Kvantisera "note len" som standard + + + Click this button to open a <em>new song</em>.<br>You can also select the <b>Open command</b> from the File menu. + Klicka här för att öppna en <em>ny sång</em>.<br>Du kan också välja menyvalet <b>Öppna</b> från Arkivmenyn. + + + 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. + 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. + + + Create New Song + Ny sång + + + loop between left mark and right mark + loopa mellan vänster och höger markering + + + record starts at left mark + inspelning börjar vid vänster markering + + + record stops at right mark + inspelning slutar vid höger markering + + + rewind to start position + spola tillbaka till startposition + + + rewind current position + flytta markörposition bakåt + + + move current position + flytta markörposition + + + stop sequencer + stoppa sequencer + + + start sequencer play + starta sequenceruppspelning + + + to record press record and then play + för att spela in, tryck på record och sen play + + + send note off to all midi channels + skicka note off till alla midi kanaler + + + select Pencil Tool: +with the pencil tool you can: + create new parts + modify length of parts + välj pennverktyg: +med pennverktyget kan du: + skapa parter + ändra längden på parter + + + + select Delete Tool: +with the delete tool you can delete parts + välj Suddverktyg: +med suddverktyget kan du ta bort parter + + + select Cut Tool: +with the cut tool you can split a part + välj Delningsverktyg: +med delningsverktyget kan du dela på parter + + + select Glue Tool: +with the glue tool you can glue two parts + välj Limverktyg: +med limverktyget kan du limma ihop två parter + + + select Score Tool: + + välj Partiturverktyg: + + + + select Quantize Tool: +insert display quantize event + välj Kvantiseringsverktyg: +sätt in kvantiseringshändelser + + + select Drawing Tool + välj Ritverktyg + + + + select Muting Tool: +click on part to mute/unmute + välj Tystningsverktyg: +klicka på en part för att Tysta/Avtysta + + + pencil + penna + + + rubber + sudd + + + cutter + delare + + + score + partitur + + + glue + lim + + + quantize + kvantisering + + + draw + rita + + + mute parts + muta parter + + + Off + Av + + + presets (*.pre *.pre.gz *.pre.bz2) + inställningar (*.pre *.pre.gz *.pre.bz2) + + + All Files (*) + Alla filer (*) + + + Add Midi Track + Lägg till Midispår + + + Add Drum Track + Lägg till Trumspår + + + Add Wave Track + Lägg till Wavespår + + + Add Audio Output + Lägg till Ljudutgång + + + Add Audio Group + Lägg till Ljudgrupp + + + Add Audio Input + Lägg till Ljudingång + + + Add Aux Send + Lägg till aux sänd + + + Click this button to enable recording + Klicka här för att spela in + + + Transport: Start playback from current location + Transport: Starta uppspelning från nuvarande position + + + Midi Strips + + + + Add Midi Output Port + + + + Add Midi Input Port + + + + Audio Strips + + + + + AboutBox + + AboutBox + OmDialog + + + Keep On Rocking! + Keep On Rocking! + + + 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 + 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 + + + + Appearance + + handle of transport window + handtag för transportfönster + + + track activity in arranger + spår-aktivitet i Arrangeraren + + + bigtime font color + bigtime typsnittsfärg + + + bigtime background color + bigtime bakgrundsfärg + + + waveedit background color + audioeditor bakgrundsfärg + + + MusE: load image + MusE: ladda bild + + + + AppearanceDialogBase + + MusE: Appearance settings + MusE: Utseendeinställningar + + + Apply + Verkställ + + + Ok + Ok + + + Cancel + Avbryt + + + Arranger + Arrangerare + + + Parts + Parter + + + show frames + visa ramar + + + show names + visa namn + + + show events + visa händelser(events) + + + show Cakewalk Style + använd Cakewalkstil + + + Events + Händelser + + + note on + not på + + + poly pressure + poly pressure + + + controller + controller + + + aftertouch + aftertouch + + + pitch bend + pitch bend + + + program change + program change + + + special + + + + Background picture + Bakgrundsbild + + + bg + + + + select... + välj... + + + show snap grid + visa rutnät + + + Colors + Färger + + + Items + Objekt + + + selected + vald + + + current: + nuvarande: + + + change... + byt... + + + dynamic colors for track activity in arranger + dynamisk färgallokering för spåraktivitet i arranger + + + Style/Fonts + Style/Typsnitt + + + QT Theme + QT-tema + + + Windows + + + + MusE + + + + Metal + + + + Norwegian Wood + + + + Platinum + + + + CDE + + + + Motif + + + + Motif Plus + + + + Fonts + Typsnitt + + + Family + Familj + + + Size + Storlek + + + Font 1 + Typsnitt 1 + + + Font 2 + Typsnitt 2 + + + Font 3 + Typsnitt 3 + + + Font 0 + Typsnitt 0 + + + Bold + Fet + + + Italic + Kursiv + + + ... + + + + Font 4 + Typsnitt 4 + + + Font 5 + Typsnitt 5 + + + Palette + Palett + + + add to palette + lägg till i palett + + + B + + + + S + + + + H + + + + V + + + + G + + + + R + + + + Itemdsfkajlk jölk ljfölajföajföajf + + + + + Arranger + + Arranger + Arrangerare + + + Cursor + Markör + + + Off + Av + + + Bar + Takt + + + Snap + Fäst vid + + + Type + Typ + + + midi song type + typ av midsång + + + Pitch + Tonhöjd + + + TrackInfo + Spårinfo + + + Track + Spår + + + Master + Master + + + Group A + Grupp A + + + Group B + Grupp B + + + Group C + Grupp C + + + Group D + Grupp D + + + + AudioConfBase + + MusE: Audio Configuration + MusE: Ljudinställningar + + + &Apply + &Verkställ + + + &OK + &Ok + + + &Cancel + &Avbryt + + + Audio Parameters + Ljudparametrar + + + Frame Size: + Ramstorlek: + + + Delay: + Fördröjning(ms): + + + Sample Rate: + Samplingsfrekvens: + + + Audio Driver + Ljuddrivrutin + + + Use Alsa + Använd Alsa + + + Use JACK + Använd JACK + + + No Audio + Ljud avstängt + + + + AudioMixerApp + + 1/2 channel + 1/2 kanal + + + record + inspelning + + + mute + tysta + + + pre fader listening + pre fader lyssning + + + record downmix + spela in nermixning + + + off + av + + + &Config + &Inställningar + + + Add Input Strip + Lägg till Input-remsa + + + Inputs + Ingångar + + + Tracks + Spår + + + Groups + Grupper + + + Master + Master + + + Group A + Grupp A + + + Group B + Grupp B + + + Group C + Grupp C + + + Group D + Grupp D + + + None + Ingen + + + &Create + &Skapa + + + + AudioStrip + + off + av + + + 1/2 channel + 1/2 kanal + + + mute + tysta + + + record downmix + spela in nermixning + + + pre fader listening + pre fader lyssning + + + Off + Av + + + Channel + Kanal + + + + ClipListEdit + + MusE: Clip List Editor + MusE: Clip-listredigerare + + + + ClipListEditorBase + + MusE: ClipList + MusE: Clip-lista + + + Name + Namn + + + Refs + + + + Start + + + + Len + + + + Data + + + + Clip Properties + Clip-egenskaper + + + Pos: + + + + Len: + + + + + CommentBase + + Form1 + + + + Track Comment + Spår-kommentar + + + Track 1 + Spår 1 + + + + ConfigMidiCtrlBase + + MusE: Config Midi Controller + MusE: Konfigurera Midi Controller + + + Midi Port: + Midi Port: + + + Available Controller: + Tillgänglig Controller: + + + Add + Lägg till + + + Remove + Ta bort + + + Automated Controller: + Automatiserad Controller: + + + &OK + &OK + + + &Cancel + &Avbryt + + + + ConfigMidiFileBase + + MusE: Config Midi File Export + MusE: Midi fil export-konfiguration + + + &OK + &OK + + + &Cancel + &Avbryt + + + 0 (single track) + 0 (enskilt spår) + + + 1 (multiple tracks) + 1 (multipla spår) + + + Format: + Format: + + + 96 + + + + 192 + + + + 384 + + + + Division: + + + + Copyright: + + + + Enable extended smf format + Slå på utbyggt smf-format + + + + ConfigTrackListBase + + MusE: Config Track List + MusE: Konfigurera Spårlista + + + Track Type: + Spårtyp: + + + Audio Output + Ljudutgång + + + Audio Group + Ljudgrupp + + + Audio Aux + Ljud Aux + + + Wave Track + Wavespår + + + Audio Input + Ljudingång + + + Soft Synthesizer + Mjukvarusynth + + + Midi Track + Midispår + + + Drum Track + Trumspår + + + Available Items: + Tillgängliga Objekt: + + + Add + Lägg till + + + Remove + Ta bort + + + Up + Upp + + + Down + Ner + + + Configured Items + Konfigurerade Objekt + + + Track Name Size: + Spårnamn Storlek: + + + &OK + &OK + + + &Cancel + &Avbryt + + + + CtrlPanel + + select controller + välj controller + + + remove panel + ta bort panel + + + Velocity + Hastighet + + + Pitch + Tonhöjd + + + other ... + annat ... + + + + DeicsOnzeGuiBase + + DeicsOnze + + + + &Presets + + + + LBA + + + + Subcategory + + + + PRO + + + + Preset + + + + Bank numerous + + + + NONE + + + + Program numerous + + + + INITVOICE + + + + DeicsOnze v0.3 Copyright (c) 2004-2005 Nil Geisweiller under GPL licence + + + + HBA + + + + Category + + + + &Global + + + + Op4 Feedback + + + + Feedback level of the operator 4 + + + + Master Volume + + + + Master volume + + + + Modulation Matrix + + + + <b>Algorithm 1</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 2</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by both <i>Op 3</i> and <i>Op 4</i><br> +<b>Algorithm 3</b> : <i>Op 1</i> modulated by both <i>Op 4</i> and <i>Op 2</i> modulated by <i>Op 3</i><br> +<b>Algorithm 4</b> : <i>Op 1</i> modulated by both <i>Op 2</i> and <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 5</b> : (<i>Op 1</i> modulated by <i>Op 2</i>) add to (<i>Op 3</i> modulated by <i>Op 4</i>) <br> +<b>Algorithm 6</b> : addition of the three <i>Op 1, 2, 3</i> all modulated by <i>Op 4</i><br> +<b>Algorithm 7</b> : addition of the three <i>Op 1, 2, 3</i> with <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 8</b> : addition of the four <i>Op 1, 2, 3, 4</i> + + + + LFO + + + + LFO Sync + + + + Pitch modulation sensitivity + + + + Pitch Modulation Sensitivity + + + + LFO Delay + + + + LFO delay + + + + LFO speed + + + + Amplitude modulation depth + + + + Pitch modulation depth + + + + Amplitude modulation sensitivity + + + + Amplitude Modulation Sensitivity + + + + AMS + + + + LFO Waveform + + + + Pitch Modulation Depth + + + + PMD + + + + LFO Speed + + + + AMD + + + + Speed + Hastighet + + + Delay + + + + PMS + + + + Pitch Envelope + + + + PL3 + + + + PL2 + + + + PL1 + + + + PR1 + + + + PR2 + + + + PR3 + + + + Op &1 + + + + OUT 1 + + + + Output Volume + + + + Volume + Volym + + + Frequency 1 + + + + Coarse 1 + + + + Coarse Ratio + + + + Fine 1 + + + + Fine Ratio + + + + Freq 1 + + + + Fixed Frequency + + + + FIX + + + + Toggle Fix Frequency + + + + Sensitivity 1 + + + + KVS1 + + + + AME1 + + + + Amplitude Modulation Enable + + + + Keyboard Velocity Sensitivity + + + + Key Velocity Sensitivity + + + + EBS1 + + + + EG Bias Sensitivity + + + + Eg Bias Sensitivity + + + + Detune, OSCWave, EGShift 1 + + + + DET1 + + + + Detune + + + + Attack Rate of the operator 1 + + + + 96dB + + + + 48dB + + + + 24dB + + + + 12dB + + + + EG Shift + + + + Wave form + + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + Amplitude Envelope 1 + + + + RR1 + + + + D1R1 + + + + D1L1 + + + + D2R1 + + + + Release Rate + + + + 2° Decay Rate + + + + 1° Decay Level + + + + 1° Decay Rate + + + + Attack Rate + + + + AR1 + + + + Scaling 1 + + + + LS1 + + + + RS1 + + + + Rate Scaling + + + + Level Scaling + + + + Op &2 + + + + Sensitivity 2 + + + + EBS2 + + + + KVS2 + + + + AME2 + + + + Detune, OSCWave, EGShift 2 + + + + DET2 + + + + OUT 2 + + + + Scaling 2 + + + + LS2 + + + + RS2 + + + + Frequency 2 + + + + Coarse 2 + + + + Fine 2 + + + + Freq 2 + + + + Amplitude Envelope 2 + + + + D1R2 + + + + D1L2 + + + + D2R2 + + + + RR2 + + + + AR2 + + + + Op &3 + + + + Sensitivity 3 + + + + EBS3 + + + + KVS3 + + + + AME3 + + + + Detune, OSCWave, EGShift 3 + + + + DET3 + + + + Frequency 3 + + + + Coarse 3 + + + + Fine 3 + + + + Freq 3 + + + + OUT 3 + + + + Scaling 3 + + + + LS3 + + + + RS3 + + + + Amplitude Envelope 3 + + + + D1R3 + + + + D1L3 + + + + D2R3 + + + + RR3 + + + + AR3 + + + + Op &4 + + + + Sensitivity 4 + + + + EBS4 + + + + KVS4 + + + + AME4 + + + + Detune, OSCWave, EGShift 4 + + + + DET4 + + + + OUT 4 + + + + Scaling 4 + + + + LS4 + + + + RS4 + + + + Frequency 4 + + + + Coarse 4 + + + + Fine 4 + + + + Freq 4 + + + + amplitude Envelope 4 + + + + AR4 + + + + D1R4 + + + + D1L4 + + + + D2R4 + + + + RR4 + + + + &Fun + + + + Phony Mode + + + + POLY + + + + MONO + + + + Reverb + + + + Foot Control + + + + Pitch Bend Range + + + + Amplitude + + + + Pitch + Tonhöjd + + + Modulation Wheel + + + + Breath Control + + + + Envelope Bias + + + + Pitch Bias + + + + After Touch + + + + Potamento + + + + FINGER + + + + FULL + + + + Portamento Mode + + + + PT + + + + Portamento Time + + + + Foot Switch + + + + Sustain + + + + Portamento + + + + Transpose + Transponera + + + &Config + &Inställningar + + + Configuration File + + + + Save + Spara + + + Load + + + + Quality + + + + High + + + + Middle + + + + Low + + + + NbrV + + + + Number of Voices + + + + Colors + Färger + + + Red + + + + Green + + + + Blue + + + + Text + Text + + + Background + + + + Edit Text + + + + Edit Background + + + + Save Mode + + + + Save only the used presets into the project + + + + Save the entire set into the project + + + + Save the configuration into the project + + + + + DrumEdit + + &File + &Arkiv + + + Load Map + Ladda mappning + + + Save Map + Spara Mappning + + + &Edit + &Redigera + + + Cut + Klipp ut + + + Copy + Kopiera + + + Paste + Klistra in + + + Delete Events + Ta bort händelser + + + Select All + Välj Allt + + + Select None + Välj Ingen + + + Invert + Invertera + + + Inside Loop + I loop + + + Outside Loop + Utanför loop + + + &Select + &Välj + + + Load Drummap + Ladda trummappning + + + Store Drummap + Spara trummappning + + + Step Record + Stegvis inspelning + + + Add Controller View + Lägg till Controller vy + + + Sound + Ljud + + + drummaps + trummappningar + + + Muse: Load Drum Map + Muse: Ladda trummappning + + + MusE: Store Drum Map + MusE: Spara trummappning + + + &Functions + &Funktioner + + + Modify Velocity + Modifiera Velocity + + + + EditCAfterDialog + + Time Position + Tidsposition + + + + EditCtrl14Dialog + + MusE: Enter Controller14 Event + MusE: Mata in Controller14 Händelse + + + Time Position + Tidsposition + + + Value + Värde + + + + EditCtrl7Dialog + + MusE: Enter Controller Event + MusE: Mata in Controller Händelse + + + Time Position + Tidsposition + + + Value + Värde + + + + EditCtrl7DialogBase + + MusE: Enter Controller + MusE: Mata in Controller + + + Controller: + Controller: + + + Time Position: + Tidspositions: + + + Value: + Värde: + + + controller value + controllervärde + + + OK + OK + + + Cancel + Avbryt + + + + EditCtrlBase + + MusE: Edit Controller Event + MusE: Redigera Controllerhändelse + + + Time Position + Tidsposition + + + Available Controller: + Tillgänglig Controller: + + + Create New Controller + Skapa Ny Controller + + + Value + Värde + + + Controller + Controller + + + H-Bank + + + + L-Bank + + + + Program + + + + off + av + + + &OK + &Ok + + + &Cancel + &Avbryt + + + Midi Port: + Midi Port: + + + Midi Channel: + Midi Kanal: + + + Time Position: + Tidsposition: + + + Patch Name + Patchnamn + + + + EditEventDialog + + Cancel + Avbryt + + + + EditInstrumentBase + + MusE: Instrument Editor + + + + Patches + Patchar + + + Patch Name: + Patchnamn: + + + High Bank: + Hög Bank: + + + Low Bank: + Låg Bank: + + + Program: + Program: + + + d.c. + dont care + + + + d.c. + + + + Patch/Group + Patch/Grupp + + + &Delete + &Ta bort + + + Alt+D + + + + &New Patch + &Ny Patch + + + Alt+N + + + + New Group + Ny Grupp + + + Drum + Trumma + + + GM + + + + GS + + + + XG + + + + Controller + Controller + + + Predefined Controller: + Fördefinierad Controller: + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + Detta är en lista över vanligt förekommande controllers. +Observera att i MusE hanteras pitch och program change som +vanliga controllers. + + + Properties + Egenskaper + + + Name + Namn + + + Type + Typ + + + Control7 + + + + Control14 + + + + RPN + + + + NRPN + + + + Pitch + Tonhöjd + + + Program + + + + H-Ctrl + + + + Midi Controller Number High Byte + Midi Controllernummer Hög Byte + + + L-Ctrl + + + + Midi Controller Number Low Byte + Midi Controllernummer Låg Byte + + + Range + Område + + + Min + + + + Max + + + + Default + + + + Name + Namn + + + Type + Typ + + + Min Val + Min värde + + + Max Val + Max värde + + + list of defined controllers + lista med definierade controllers + + + This is the MusE list of defined controllers. + Detta är MusEs lista med definierade controllers. + + + SysEx + + + + Initialization + Initiering + + + Panic + Panik + + + Hex Entry: + Hex Värde: + + + &File + &Arkiv + + + Tools + Verktyg + + + New + Ny + + + &New + &Ny + + + Ctrl+N + + + + Open + Öppna + + + &Open... + &Öppna... + + + Ctrl+O + + + + Save + Spara + + + &Save + &Spara + + + Ctrl+S + + + + Save As + Spara som + + + Save &As... + S&para som... + + + Exit + Stäng + + + E&xit + S&täng + + + + EditMetaDialog + + MusE: Enter Meta Event + MusE: Mata in Meta Händelse + + + Time Position + Tidsposition + + + Meta Type + Metatyp + + + Enter Hex + Mata in Hex + + + + EditMetaDialogBase + + MusE: Enter Meta Event + MusE: Mata in Meta Händelse + + + OK + OK + + + Cancel + Avbryt + + + TextLabel1 + + + + Time Position: + Tidsposition: + + + Meta Type: + Metatyp: + + + Enter Hex + Mata in hex + + + + EditNoteDialogBase + + MusE: Enter Note + MusE: Mata in Not + + + OK + OK + + + Cancel + Avbryt + + + Length: + Längd: + + + Time Position: + Tidsposition: + + + Pitch: + Tonhöjd: + + + Velocity On: + Velocity På: + + + Velocity Off: + Velocity Av: + + + + EditPAfterDialog + + MusE: Enter Poly Aftertouch + MusE: Mata in Poly Aftertouch + + + Time Position + Tidsposition + + + Pitch + Tonhöjd + + + + EditPitchDialog + + MusE: Enter Pitch Shift + MusE: Mata in Pitch Shift + + + Time Position + Tidsposition + + + Pitch + Tonhöjd + + + + EditSysexDialogBase + + MusE: Enter SysEx + MusE: Mata in SysEx + + + TimePosition: + Tidsposition: + + + Comment: + Kommentar: + + + OK + OK + + + Cancel + Avbryt + + + Known SysEx: + Känd SysEx: + + + Add + Lägg till + + + + EditToolBar + + Edit Tools + Redigeringsverktyg + + + + EffectRack + + effect rack + effektrack + + + move up + flytta upp + + + move down + flytta ner + + + remove + ta bort + + + show gui + visa gui + + + new + ny + + + change + ändra + + + + FLUIDGuiBase + + Load + Ladda + + + Form1 + + + + Soundfont + + + + + FLUIDSynthGuiBase + + Gain + Förstärkning + + + Room Size + Rumsstorlek + + + Damping + Dämpning + + + Level + Nivå + + + Width + Bredd + + + Speed + Hastighet + + + Depth + Djup + + + Number + Nummer + + + Type + Typ + + + Sine + Sinus + + + Triangle + Triangel + + + Load + Ladda + + + Save + Spara + + + Delete + Ta bort + + + Fontname + Fontnamn + + + FLUID Synth + + + + Dump Info + + + + ID + + + + Chnl + + + + Soundfont + + + + Drum Chnl + + + + Reverb + + + + CHANNEL SETUP + + + + Chorus + + + + LOADED SOUNDFONTS + + + + + FileDialogButtons + + Form1 + + + + Global + + + + User + Användare + + + Project + Projekt + + + Load: + Öppna: + + + Songdata + +Cofiguration + Sångdata + Konfiguration + + + only +Songdata + enbart Sångdata + + + + FontSel + + Size: + Storlek: + + + + GateTimeBase + + MusE: Modify Gate Time + MusE: Ändra Gate-tid + + + Range + Område + + + All Events + Alla Händelser + + + Selected Events + Valda Händelser + + + Looped Events + Loopade Händelser + + + Selected & Looped + Valda & Loopade + + + Values + Värden + + + Rate: + Hastighet: + + + Offset: + Offset: + + + % + + + + OK + OK + + + Cancel + Avbryt + + + + GlobalSettingsDialogBase + + MusE: Global Settings + MusE: Globala Inställningar + + + &Apply + &Verkställ + + + &Ok + &Ok + + + &Cancel + &Avbryt + + + Audio + Ljud + + + Mixer + Mixer + + + dB + + + + min. Meter Value + min. Metervärde + + + min.Slider Val + min. Slider värde + + + Midi + Midi + + + Ticks + + + + 1024 + + + + 2048 + + + + 4096 + + + + 8172 + + + + Displayed Resolution +(Ticks/Quarternote) + Visad upplösning +(Tick/Kvartsnot) + + + 48 + + + + 96 + + + + 192 + + + + 384 + + + + 768 + + + + 1536 + + + + 3072 + + + + 6144 + + + + 12288 + + + + RTC Resolution +(Ticks/Sec) + RTC-Upplösning +(Tick/Sek) + + + GUI + + + + Help Browser: + Hjälpläsare: + + + GUI Refresh Rate + GUI-uppdateringsfrekvens + + + /sec + /sek + + + Application + Applikation + + + Start Muse + Starta MusE + + + start with last song + starta med senaste projekt + + + start with song + starta med projekt + + + start song: + starta projekt: + + + Views + Vyer + + + y-pos + + + + show + visa + + + x-pos + + + + height + höjd + + + width + bredd + + + Big Time + + + + Arranger + Arrangerare + + + Transport + + + + Cur + Nuv + + + set current values + sätt nuvarande värden + + + start with template: default.med + starta med mall: default.med + + + show splash screen + visa splashscreen + + + use JACK freewheel mode if possible + använd JACK freewheel om möjligt + + + Mixer 1 + + + + Mixer 2 + + + + + LMaster + + MusE: Mastertrack + MusE: Masterspår + + + new tempo + nytt tempo + + + new signature + ny signatur + + + Time + Tid + + + Type + Typ + + + Value + Värde + + + + ListEdit + + Insert Note + Mata in Not + + + insert Note + Mata in Not + + + Insert SysEx + Mata in SysEx + + + insert SysEx + Mata in SysEx + + + Insert Ctrl + Mata in Ctrl + + + insert Ctrl + Mata in Ctrl + + + Insert Meta + Mata in Meta + + + insert Meta + Mata in Meta + + + Insert Pitch + Mata in Pitch + + + insert Pitch + Mata in Pitch + + + Insert Channel Aftertouch + Mata in Aftertouch för kanal + + + insert Channel Aftertouch + Mata in Aftertouch för kanal + + + Insert Key Aftertouch + Mata in Key Aftertouch + + + insert Poly Aftertouch + Mata in Poly Aftertouch + + + &Edit + &Redigera + + + Cut + Klipp ut + + + Copy + Kopiera + + + Paste + Klistra in + + + Delete Events + Ta bort Händelser + + + List Tools + Listverktyg + + + Insert Tools + Inmatningsverktyg + + + Bar + Takt + + + Comment + Kommentar + + + + MITTransposeBase + + MusE: Midi Input Plugin: Transpose + MusE: Midi Inputplugin: Transponering + + + On + + + + Transpose: + Transponering: + + + TriggerKey + + + + +0 + + + + + MPConfig + + none + inga + + + other raw ... + annan raw ... + + + MusE: Midi Port Table + MusE: Midiporttabell + + + Device Name + Enhetsnamn + + + State + Status + + + unknown + okänd + + + + MRConfigBase + + MusE: Midi Input Plugin: Remote Control + MusE: Midiinputplugin: Fjärrkontroll + + + Activate + Aktivera + + + On + + + + Actions + Kommandon + + + Stop + Stopp + + + Record + Inspelning + + + Goto Left Mark + Gå till vänster markering + + + Play + Spela + + + + MTScale + + bar scale + takt skala + + + + MarkerView + + MusE: Marker + MusE: Markör + + + add marker + lägg till markör + + + Add Marker + Lägg till Markör + + + delete marker + ta bort markör + + + Delete Marker + Ta bort Markör + + + &File + &Arkiv + + + &Edit + &Redigera + + + Bar:Beat:Tick + Takt:Slag:Tick + + + Lock + Lås + + + Text + Text + + + Marker Properties + Markörinställningar + + + + MasterEdit + + MusE: Mastertrack + MusE: Masterspår + + + edit tools + redigeringsverktyg + + + EnableMaster + Aktivera Master + + + use master track + använd master track + + + Cursor + Markör + + + Off + Av + + + Snap + Fäst vid + + + time at cursor position + tid vid markörposition + + + tempo at cursor position + tempo vid markörposition + + + tempo at current position + tempo vid nuvarande position + + + time signature at current position + time signature vid nuvarande position + + + + MetronomeConfigBase + + MusE: Metronome Config + MusE: Metronomeconfiguration + + + Metronome + Metronom + + + Audio Beep + Audio - Ton + + + Midi Channel + Midi kanal + + + Measure Note + Takt Not + + + Measure Velocity + Takt-anslag + + + Beat Velocity + Slag-anslag + + + Beat Note + Slag-not + + + Precount + Inräkning + + + enable + + + + Bars + Takter + + + From Mastertrack + Från Masterspår + + + &Apply + &Verställ + + + &OK + &Ok + + + &Cancel + &Avbryt + + + + MidiController + + Velocity + Hastighet + + + + MidiControllerEditDialog + + MusE: save midi controller list + MusE: spara midi-controller lista + + + MusE: load midi controller list + MusE:ladda midi-controller lista + + + + MidiControllerEditDialogBase + + MusE: Define Midi Controller + MusE: Definiera Midi-controller + + + replace controller set + ersätt controller-set + + + merge controller set + slå ihop controller-set + + + save controller set as + spara controller-set + + + Name + Namn + + + Type + Typ + + + Min Val + Min värde + + + Max Val + Max värde + + + list of defined controllers + lista med definierade controllers + + + This is the MusE list of defined controllers. + Detta är MusEs lista med definierade controllers. + + + Properties + Egenskaper + + + Name + Namn + + + Max Value + Max värde + + + Min Value + Min värde + + + Type + Typ + + + &New + &Ny + + + create new entry + skapa nytt inlägg + + + pressing the New button you create a new entry +in the MusE list of defined controllers + tryck på Ny knappen för att skapa nytt inlägg +i MusEs lista med definierade controllers + + + &Delete + &Ta bort + + + delete selected entry + ta bort valt inlägg + + + &OK + &Ok + + + &Cancel + &Avbryt + + + &Add + &Lägg till + + + Alt+A + Alt+L + + + Predefined Controller: + Fördefinierad Controller: + + + H-Ctrl + + + + L-Ctrl + + + + Managed Controller for Port + Hanterad Controller för Port + + + Channel + Kanal + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. + Detta är en lista över vanligt förekommande controllers. +Observera att i MusE hanteras pitch och program change som +vanliga controllers. + + + Control7 + + + + Control14 + + + + RPN + + + + NRPN + + + + Pitch + Tonhöjd + + + Program + + + + Midi Controller Number High Byte + Midi Controllernummer Hög Byte + + + Midi Controller Number Low Byte + Midi Controllernummer Hög Byte + + + Range + Område + + + + MidiFileConfig + + Config exported Midi Files + Inställningar exporterade midifiler + + + MusE: Config exported Midi Files + MusE: Inställningar exporterade midifiler + + + Enable extended smf format + Slå på utbyggt smf-format + + + + MidiFilterConfigBase + + MusE: Midi Input Filter + MusE: Midi Indatafilter + + + Record Filter + Indata Filter + + + Note On + Not På + + + Controller + Controller + + + &OK + &Ok + + + &Cancel + &Avbryt + + + + MidiInputTransformDialog + + New + Ny + + + + MidiInputTransformDialogBase + + MusE: Midi Input Transformator + MusE: Midi inputtransformator + + + Filter + Filter + + + All + Alla + + + Equal + Lika + + + Unequal + Ej lika + + + Note + Not + + + Value 2 + Värde 2 + + + Value 1 + Värde 1 + + + Event Type + Händelsetyp + + + Ignore + Ignorera + + + Higher + Högre + + + Lower + Lägre + + + Inside + Innanför + + + Outside + Utanför + + + Channel + Kanal + + + Processing + Bearbetar + + + Keep + Behåll + + + Multiply + Multiplicera + + + Divide + Dividera + + + Invert + Invertera + + + Flip + Flippa + + + Random + Slumpmässig + + + Modules + Moduler + + + enable modul 1 + aktivera modul 1 + + + enable modul 2 + aktivera modul 2 + + + enable modul 3 + aktivera modul 3 + + + enable modul 4 + aktivera modul 4 + + + Name: + Namn: + + + Comment: + Kommentar: + + + Function + Funktion + + + &New + &Ny + + + create new preset + skapa nytt preset + + + &Delete + &Ta bort + + + delete preset + ta bort preset + + + &Dismiss + &Stäng + + + PresetList + Presetlista + + + + MidiPort + + not configured + ej konfigurerad + + + unknown + okänd + + + + MidiPortRouteBase + + MusE: Midi Port Routing + MusE: Midi Port Routing + + + Port 2 + + + + Output + + + + Input + + + + + MidiRawDeviceDialogBase + + MusE: raw midi device configuration + MusE: raw midienhets-inställningar + + + Name + Namn + + + Type + Typ + + + Virt. Ports + Virt. port + + + Speed + Hastighet + + + Handshaking + Handskakning + + + Virt.Ports + Virt.port + + + Serial Port + Serieport + + + None + Ingen + + + &New + &Ny + + + &Delete + &Ta bort + + + &OK + &Ok + + + &Cancel + &Avbryt + + + + MidiStrip + + off + av + + + mute + tysta + + + pre fader listening + pre fader lyssning + + + Off + Av + + + + MidiSyncConfigBase + + MusE: Midi Sync + MusE: Midisync + + + Master + Master + + + Slave + Slav + + + Sync Source + Sync-källa + + + all + alla + + + midi port + midiport + + + Midi Clock + Midiklocka + + + Apply + Verkställ + + + Cancel + Avbryt + + + Type: + Typ: + + + Offset: + Offset: + + + hour + timma + + + minute + minut + + + second + sekund + + + Sync Mode + + + + accept MTC + + + + accept Midi Clock + + + + accept MMC + + + + Id: + + + + device id + + + + Sync Gen + + + + Midi Time Code (MTC) + + + + Midi Machine Control (MMC) + + + + Ok + Ok + + + MTC + + + + 24 + + + + 25 + + + + 30D + + + + 30N + + + + h + + + + m + + + + s + + + + frame + + + + f + + + + subframe + + + + + MidiTrackInfoBase + + MusE: TrackInfo + MusE: Spårinfo + + + output channel + utgångskanal + + + all midi events are send to this output channel + alla midihändelser skickas till denna utkanal + + + Track Info + Spårinfo + + + Track Name + Spårnamn + + + output port + utgångsport + + + off + av + + + change stereo position + byt stereoposition + + + select instrument patch + välj instrumentpatch + + + Volume + Volym + + + Channel Info + Kanalinfo + + + Velocity + Hastighet + + + Length + Längd + + + input ports + inputportar + + + input channels + inputkanaler + + + 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 + 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 + + + Output Channel + + + + % + + + + Modify Note Length + + + + Output Port + Utgångsport + + + OCh. + + + + Track Delay (ticks) + + + + Compress Note Velocity + + + + Pitch Transpose + + + + Transp. + + + + Delay + + + + Compr. + + + + Modify Note Velocity + + + + Input Ports + + + + IChan. + + + + Input Channels + + + + ??? + + + + Select Instrument Patch + + + + Bank Select LSB + + + + Bank Select MSB + + + + H-Bank + + + + Instrument High Bank + + + + L-Bank + + + + Instrument Low Bank + + + + Progr. + + + + Instrument/Program/Patch + + + + + MidiTransformDialogBase + + &New + &Ny + + + &Delete + &Ta bort + + + &Apply + &Verkställ + + + &OK + &Ok + + + &Cancel + &Avbryt + + + Processing + Bearbetar + + + Event Type + Händelsetyp + + + Keep + Behåll + + + Note + Not + + + Multiply + Multiplicera + + + Value 2 + Värde 2 + + + Invert + Invertera + + + Random + Slumpmässig + + + Value 1 + Värde 1 + + + Length + Längd + + + Filter + Filter + + + All + Alla + + + Equal + Lika + + + Unequal + Ej lika + + + Ignore + Ignorera + + + Higher + Högre + + + Lower + Lägre + + + Inside + Innanför + + + Outside + Utanför + + + Bar Range + Takt Område + + + Name: + Namn: + + + Comment: + Kommentar: + + + Range + Område + + + process all events + bearbeta alla händelser + + + selected tracks + valda spår + + + inside loop + I loop + + + Select + Välj + + + Quantize + Kvantisera + + + Delete + Ta bort + + + Transform + Transformera + + + Insert + Sätt in + + + Copy + Kopiera + + + Quantize Value + Kvantisera värde + + + MusE: Midi Transformator + + + + PresetList + Presetlista + + + Fix + + + + Poly Pressure + + + + Control Change + + + + Aftertouch + + + + Pitch Bend + + + + NRPN + + + + RPN + + + + Plus + + + + Minus + + + + Divide + Dividera + + + ScaleMap + + + + Flip + Flippa + + + Dyn + + + + Position + + + + Sysex + + + + Meta + + + + Preset + + + + Function + Funktion + + + Extract + + + + + MidiTransformerDialog + + New + Ny + + + + MixdownFileDialog + + Wave Files (*.wav);;All Files (*) + Wavefiler (*.wav;;All FIles (*) + + + + MixdownFileDialogBase + + MusE: Set Mixdown Wavefile + MusE: Välj mixdown-ljudfil + + + &OK + &Ok + + + &Cancel + &Avbryt + + + File Path + Sökväg till fil + + + Channel + Kanal + + + Stereo + + + + Mono + + + + 5.1 + + + + wav,16 Bit + + + + wav, 24 Bit + + + + wav, 32 Bit (float) + + + + Format + + + + + Mixer + + MusE: Midi Mixer + MusE: Midimixer + + + Master + Master + + + + MusE + + to import a audio file you have first to selecta audio track + för att importera en ljudfil måste du ha valt ett ljudspår + + + Import Wave File + Importera ljudfil + + + UndoRedo + ÅngraGörom + + + undo + ångra + + + Und&o + &Ångra + + + redo + gör om + + + Re&do + &Gör om + + + undo last change to song + ångra sista ändring i sång + + + redo last undo + gör om sista ångring + + + Transport + + + + loop + + + + Loop + + + + punchin + + + + Punchin + + + + punchout + + + + Punchout + + + + start + + + + Start + + + + rewind + flytta tillbaka + + + Rewind + Spola tillbaka + + + forward + framåt + + + Forward + Framåt + + + stop + stopp + + + Stop + Stopp + + + play + spela + + + Play + Spela + + + record + spela in + + + Record + Spela in + + + panic + panik + + + Panic + Panik + + + new + ny + + + &New + &Ny + + + open + öppna + + + &Open + &Öppna + + + save + spara + + + &Save + &Spara + + + pianoroll + pianorulle + + + Pianoroll + Pianorulle + + + score + partitur + + + Score + Partitur + + + marker + markör + + + Marker + Markör + + + File Buttons + Arkivknappar + + + &File + &Arkiv + + + Open &Recent + &Nyligen öppnade + + + Save &As + S&para som + + + Config &Printer + &Konfigurera skrivare + + + Import Midifile + Importera midifil + + + Export Midifile + Exportera midifil + + + &Quit + A&vsluta + + + &Edit + &Redigera + + + C&ut + Klipp &ut + + + &Copy + &Kopiera + + + &Paste + K&listra in + + + Delete Track + Ta bort spår + + + Add Track + Lägg Till Spår + + + Select &All + Markera &Allt + + + &Deselect All + A&vmarkera Allt + + + Invert &Selection + Invertera &Markering + + + &Inside Loop + &I Loop + + + &Outside Loop + &Utanför Loop + + + All &Parts on Track + Alla &Parter i spår + + + Select + Välj + + + Drums + Trummor + + + List + Lista + + + Graphic + Grafik + + + Mastertrack + Masterspår + + + Midi &Transform + Midi &Transform + + + Modify Gate Time + Modifiera Gate Time + + + Modify Velocity + Modifiera Velocity + + + Crescendo + + + + Transpose + Transponera + + + Thin Out + Tunna ut + + + Erase Event + Ta bort Händelse + + + Note Shift + Shifta Not + + + Move Clock + Flytta Klocka + + + Copy Measure + Kopiera Takt + + + Erase Measure + Radera Takt + + + Delete Measure + Ta bort Takt + + + Create Measure + Skapa Takt + + + Mix Track + Mixa Spår + + + Midi + Midi + + + &Structure + &Struktur + + + Global Cut + Globalt klipp + + + Global Insert + Global insättning + + + Global Split + Global delning + + + Copy Range + Kopiera Område + + + Cut Events + Klipp ut Händelse + + + Transport Panel + + + + Bigtime window + Bigtime fönster + + + dont follow Song + följ inte Sång + + + follow page + följ sida + + + follow continuous + följ kontinuerligt + + + &Config + &Inställningar + + + Global Settings + Globala Inställningar + + + follow song + följ sång + + + Metronome + Metronom + + + Midi Sync + Midi Synk + + + Midi File Config + Midi Filkonfigurering + + + Appearance settings + Utseende inställningar + + + Soft Synthesizer + Mjukvarusynthar + + + Midi Ports + Midiportar + + + Audio System + Audiosubsystem + + + Save Configuration + Spara Inställningar + + + Midi Input Filter + Midi Indatafilter + + + Midi Remote Control + Midi-fjärrkontroll + + + Random Rhythm Generator + Slumprytmgenerator + + + &Midi + &Midi + + + Mixer + Mixer + + + Define Controller + Definiera Controller + + + Input Plugins + + + + Reset Instr. + Resetta Instr. + + + Init Instr. + Initiera instr. + + + local off + lokal av + + + &Audio + Au&dio + + + Bounce to Track + Bounce till Spår + + + Bounce to File + Bounce till Fil + + + &Help + &Hjälp + + + Browser + Läsare + + + &About + &Om + + + About&Qt + Om &Qt + + + What's &This + Vad är &Detta + + + Unknown File Format + Okänt filformat + + + none + inget + + + MusE: load project + MusE: Öppna projekt + + + MusE: Write File failed + MusE: Misslyckades med att skriva Fil + + + The current Project contains unsaved data +Save Current Project? + Det nuvarande Projektet innehåller osparade ändringar +Spara nuvarande Projekt? + + + &Nosave + Spara &inte + + + &Abort + &Avbryt + + + MusE: About + MusE: Om + + + MusE: Save As + MusE: Spara Som + + + MusE: Song: + MusE: Sång: + + + MusE: Import Midi + MusE: Importera Midi + + + MusE: Export Midi + MusE: Exportera Midi + + + reading midifile + + läser midifil + + + +failed + misslyckades + + + Nothing to edit + Inget att redigera + + + MusE: Copy Range + MusE: Kopiera område + + + not implemented + ej implementerat + + + MusE: Cut Events + MusE: Klipp ut Händelse + + + MusE: Bounce to Track + MusE: Bounce till Spår + + + more than one target track selected + mer än ett spår valt som mål + + + wrong target track type, +select wave track as target + fel spårtyp som mål +välj wave-spår som mål + + + no target track selected + inget spår valt som mål + + + The current Project contains unsaved data +Load overwrites current Project: +Save Current Project? + Det nuvarande Projektet innehåller osparade ändringar +Öppning ersätter nuvarande Projekt +Spara nuvarande Projekt? + + + &Overwrite + &Ersätt + + + no help found at: + ingen h jälp hittad vid: + + + MusE: Open Help + Muse: Arkiv hjälp + + + Delete Selected Tracks + Ta Bort Valda Spår + + + View + Vy + + + Edit Instrument + Editera Instrument + + + Restart Audio + Starta om Audio + + + Take Snapshot + Ta Ögonblicksbild + + + Clear Automation Data + Rensa Automationsdata + + + Settings + Inställningar + + + Configure shortcuts + Konfigurera Tangentbordsgenvägar + + + Midi File Export + Midi Fil Export + + + Midi Ports / Soft Synth + Midiportar / Mjukvarusynthar + + + &Manual + &Manual + + + &MusE homepage + &MusE hemsida + + + &Report Bug... + &Rapportera Bugg... + + + &About MusE + &Om MusE + + + What's &This? + Vad är de&t här? + + + Cannot read template + Kan inte läsa mall + + + File open error + Fel vid öppning av fil + + + File read error + Fel vid läsning av fil + + + MusE: load template + MusE: ladda mall + + + MusE: Bounce + MusE: Mixa Ner + + + set left/right marker for bounce range + sätt vänster/höger markör för nedmixningsområde + + + MusE: Bounce to File + MusE: Mixa Ner till Fil + + + no output track found + inget utmatningsspår kunde hittas + + + Add midi file to current project? + + Lägg till midifil i nuvarande projekt? + + + + &Add to Project + &Lägg till i Projekt + + + &Replace + E&rsätt + + + +failed: + +misslyckades: + + + Arranger + Arrangerare + + + Cursor + Markör + + + Off + Av + + + Bar + Takt + + + Snap + Fäst vid + + + Len + + + + Pitch + Tonhöjd + + + midi pitch + midi tonhöjd + + + global midi pitch shift + global midi tonhöjdsförändring + + + Tempo + + + + midi tempo + + + + N + + + + MusE: Create tmp file failed + MusE: Skapande av temporär fil misslyckades + + + &View + &Vy + + + Au&tomation + Au&tomation + + + Setti&ngs + I&nställningar + + + Mixer 1 + + + + Mixer 2 + + + + + NoteInfo + + Note Info + Notinfo + + + Pitch + Tonhöjd + + + + OrganGuiBase + + Presets + Preset + + + load preset list + öppna presetlista + + + save preset list + spara presetlista + + + MusE: Organ + + + + Drawbars + + + + 16' + + + + 4' + + + + 2 2/3' + + + + 2' + + + + 5 1/3' + + + + 8' + + + + Envelope Hi + + + + Release + + + + Sustain + + + + Decay + + + + Attack + + + + ms + + + + cB + + + + Envelope Lo + + + + O-1 + + + + Oscillator + + + + Brass + + + + Reed + + + + Flute + + + + Velocity + Hastighet + + + + PageSettings + + Paper Size + Pappersstorlek + + + user + användare + + + Margins + Marginal + + + left Margin + vänster Marginal + + + top Margin + övre Marginal + + + right Margin + höger Marginal + + + bottom Margin + undre Marginal + + + Header + Överskrift + + + Title + Titel + + + Author + Författare + + + Fonts + Typsnitt + + + Page No. + Sidnummer. + + + Measure No + Taktnummer + + + Track Name + Spårnamn + + + Lyrics + Text + + + Layout + Utseende + + + Bars across the Page + Takter över sidan + + + Scale + Skala + + + Flags + Flaggor + + + show page no. + visa sida nr. + + + show measure no. + visa takt nr. + + + show track name + visa spårnamn + + + Apply + Verkställ + + + Cancel + Avbryt + + + + PartCanvas + + Cannot copy/move/clone to different Track-Type + Kan inte kopiera/flytta/klona till annan Spårtyp + + + C&ut + Klipp &ut + + + &Copy + &Kopiera + + + rename + byt namn + + + color + färg + + + delete + ta bort + + + split + dela + + + glue + lim + + + de-clone + häv kloning + + + pianoroll + pianorulle + + + score + partitur + + + list + lista + + + drums + trummor + + + wave edit + wave redigering + + + Cannot paste: multiple tracks selected + Kan inte klistra in: flera spår valda + + + Cannot paste: no track selected + Kan inte klistra in: inget spår valt + + + Cannot paste midi parts to wave track + Kan inte klistra in midipart till wavespår + + + Cannot paste wave parts to midi track + Kan inte klistra in wavepart på midispår + + + Cannot paste: wrong data type + Kan inte klistra in: fel datatyp + + + + PatchBayBase + + ALSA Patch Bay + + + + + PianoRoll + + &Edit + &Redigera + + + Cut + Klipp ut + + + Copy + Kopiera + + + Paste + Klistra in + + + Delete Events + Ta bort Händelser + + + Select All + Välj Allt + + + Select None + Välj Ingen + + + Invert + Invertera + + + Inside Loop + I loop + + + Outside Loop + Utanför loop + + + &Select + &Välj + + + blue + blå + + + pitch colors + pitchfärger + + + velocity colors + velocityfärger + + + &Config + &Inställningar + + + event color + händelsefärg + + + &Functions + &Funktioner + + + Over Quantize + Över Kvantisera + + + Note On Quantize + Note On-kvantisera + + + Note On/Off Quantize + Note On/Off Kvantisera + + + Iterative Quantize + Iterativ kvantisering + + + Config Quant... + Konfigurera Kvant... + + + Modify Gate Time + Modifiera Gate Time + + + Modify Velocity + Modifiera Velocity + + + Transpose + Transponera + + + Thin Out + Tunna ut + + + Erase Event + Ta bort Händelse + + + Note Shift + Shifta Not + + + Move Clock + Flytta Klocka + + + Copy Measure + Kopiera Takt + + + Erase Measure + Radera Takt + + + Delete Measure + Ta bort Takt + + + Create Measure + Skapa Takt + + + Pianoroll Tools + Verktyg Pianorulle + + + Step Record + Stegvis inspelning + + + Play Events + Spela Händelser + + + Add Controller View + Lägg till Controller Vy + + + + PluginDialog + + MusE: select plugin + MusE: välj plugin + + + Lib + + + + Label + Etikett + + + Name + Namn + + + AI + + + + AO + + + + CI + + + + CO + + + + IP + + + + id + + + + Maker + Upphovsman + + + Copyright + + + + Ok + Ok + + + Cancel + Avbryt + + + Select which types of plugins should be visible in the list,<br>beware that 'all' includes plugins that probably are not usable by MusE. + Välj vilka typer av plugins som ska vara synliga i lista,<br>Observera att 'alla' inkluderar plugins som möljigtvis inte är användbara i MusE. + + + Stereo and Mono + Stereo och Mono + + + Stereo + + + + Mono + + + + All + Alla + + + 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. + + + + + PluginGui + + File Buttons + Arkiv Knappar + + + Load Preset + Öppna Preset + + + Save Preset + Spara Preset + + + bypass plugin + koppla ur plugin + + + MusE: load preset + MusE: öppna preset + + + MusE: save preset + MusE: spara preset + + + + PrinterConfig + + MusE: Config Printer + MusE: Konfigurera Skrivare + + + Print to file + Skriv till fil + + + Print Command + Utskriftskommando + + + Preview Command + Förhandsgranskningskommando + + + Cancel + Avbryt + + + + QHeader + + Port Number + Portnummer + + + enable gui for device + visa gui för enhet + + + enables recording from the device + slå på inspelning från enhet + + + Name of the midi device associated with this port number + Namn på midienhet associerad med detta portnummer + + + Instrument connected to port + Instrument kopplat till denna port + + + State: result of opening the device + Status: resultat av öppning av enhet + + + mute instrument + tysta instrument + + + sound name + ljudnamn + + + quantisation +currently not used + kvantisering +används inte för tillfället + + + this input note triggers the sound + denna in-not triggar ljudet + + + note length + notlängd + + + this note is send for the sound + denna not skickas för ljudet + + + output channel +currently not used + utgångskanal +används inte för tillfället + + + output port +currently not used + utgångsport +används inte för tillfället + + + velocity level 1 + velocity nivå 1 + + + velocity level 2 + velocity nivå 2 + + + velocity level 3 + velocity nivå 3 + + + velocity level 4 + velocity nivå 4 + + + quantisation + kvantisering + + + output channel + utgångskanal + + + output port + utgångsport + + + Enable Recording + Slå på Inspelning + + + Track Activity + Spåraktivitet + + + Mute Indicator + Tyst-Indikator + + + Solo Indicator + Solo-Indikator + + + Track Type + Spårtyp + + + Track Name + Spårnamn + + + Output Channel Number + Kanalnummer för utgång + + + Output Port + Utgångsport + + + Time Lock + Tidlås + + + Solo/Pre Fader Listening + Solo/För-reglage lyssning + + + enables reading from device + möjliggör läsning från enhet + + + enables writing to device + möjliggör skrivning till enhet + + + + QPopupMenu + + Add Soft Synth + Lägg till Mjukvarusynth + + + Add Midi Generator... + + + + Add Soft Synth... + + + + + QWidget + + Velocity + Hastighet + + + Cannot convert sysex string + Kan inte konvertera sysex-sträng + + + Hex String too long (2048 bytes limit) + Hex-sträng för lång (2048 bytes maxgräns) + + + generic midi + generell midi + + + new + ny + + + create peakfile for + skapa "peak"-fil + + + Cannot transform non empty track + Kan inte transformera ej tomt spår + + + MusE: get file name + MusE: hämta filnamn + + + the directory + + katalogen + + + +does not exist +create? + +finns inte +skapa? + + + &Create + &Skapa + + + Cancel + Avbryt + + + MusE: create directory + MusE: skapa katalog + + + creating dir failed + misslyckades med att skapa katalog + + + File + + Filen + + + + +exists + +existerar + + + MusE: write + MusE: skriv + + + Overwrite + Ersätt + + + Quit + Avsluta + + + Open File + + Öppna fil + + + +failed: + +misslyckades: + + + MusE: Open File + MusE: Öppna fil + + + None + Ingen + + + Master + Master + + + Group %c + Grupp %c + + + Unknown + Okänd + + + Group + Grupp + + + File + Filen + + + exists + existerar + + + + QuantConfig + + MusE: Config Quantize + MusE: Konfigurera Kvantisering + + + Config Quantize + Konfigurera Kvantisering + + + Strength + Styrka + + + Don´t Quantize + Kvantisera Inte + + + Quant Len + Kvant Längd + + + + QuantDialog + + Display Quantize + Visa Kvantisering + + + Note Quantize + Not Kvantisering + + + Rest Quantize + Rest Kvantisering + + + Cancel + Avbryt + + + + RhythmBase + + MusE: Random Rhythm Generator + MusE: Slumprytmgenerator + + + Instrument Properties + Instrumentinställningar + + + counts/bar + slag/takt + + + steps/count + steg/slag + + + # bars + # takter + + + randomize + slumpa + + + Group 1 + Grupp 1 + + + Group 2 + Grupp 2 + + + Group 3 + Grupp 3 + + + Group 4 + Grupp 4 + + + Group 5 + Grupp 5 + + + listen + lyssna + + + Instrument + Instrument + + + Group + Grupp + + + &New + &Ny + + + create new entry + skapa nytt inlägg + + + pressing the New button you create a new entry +in the MusE list of defined controllers + skapa nytt inlägg genom att trycka på Ny knappen +i MusEs lista över definierade controllers + + + &Delete + &Ta bort + + + delete selected entry + ta bort valt inlägg + + + Up + Upp + + + Down + Ner + + + steps/count + steg/slag + + + list of defined controllers + lista med definierade controllers + + + This is the MusE list of defined controllers. + Detta är MusEs lista med definierade controllers. + + + &File + A&rkiv + + + &Edit + &Redigera + + + &Help + &Hjälp + + + Tools + Verktyg + + + New + Ny + + + Open + Öppna + + + &Open... + &Öppna... + + + Save + Spara + + + &Save + &Spara + + + Save As + Spara som + + + Save &As... + S&para som... + + + Print + Skriv ut + + + &Print... + Skriv &ut... + + + Exit + Stäng + + + E&xit + S&täng + + + Undo + Ångra + + + &Undo + &Ångra + + + Redo + Gör om + + + &Redo + Gör &om + + + Cut + Klipp ut + + + &Cut + Klipp &ut + + + Copy + Kopiera + + + C&opy + &Öppna + + + Paste + Klistra in + + + &Paste + K&listra in + + + Find + Sök + + + &Find... + &Sök... + + + Contents + Innehåll + + + &Contents... + &Innehåll... + + + &Index... + &Index... + + + About + Om + + + &About... + &Om... + + + <b>Notice!</b><br> +Random Rhythm Generator is not enabled yet! + <b>Observera!</b><br> +Slumprytms-generator fungerar inte än! + + + + RhythmGenerator + + Instrument Settings: + Instrumentinställningar: + + + Instrument + Instrument + + + add + lägg till + + + delete + ta bort + + + count/bar + slag/takt + + + # bars + # takt + + + Group Settings: + Gruppinställningar: + + + Group + Grupp + + + Group 1 + Grupp 1 + + + Group 2 + Grupp 2 + + + Group 3 + Grupp 3 + + + Group 4 + Grupp 4 + + + Group 5 + Grupp 5 + + + listen + lyssna + + + Randomize + Slumpa + + + Rhythm Style: + Rytmstil: + + + Clear + Rensa + + + Open... + Öppna... + + + Save + Spara + + + Save as... + Spara som... + + + Generate + Generera + + + Close + Stäng + + + + RouteDialogBase + + MusE: Routing + + + + Add Route + Lägg till rutt + + + Source: + Källa: + + + Destination: + Destination: + + + Connect + Koppla + + + connect source to destination + koppla källa till destination + + + Current Routes + Nuvarande rutter + + + Source + Källa + + + Destination + + + + Remove + Ta bort + + + remove selected route + ta bort vald rutt + + + + SS_PluginChooserBase + + SimpleDrums - Ladspa Plugin Chooser + + + + Name + Namn + + + Label + Etikett + + + Inports + + + + Outports + + + + Creator + + + + &Cancel + &Avbryt + + + Alt+C + + + + &OK + + + + Alt+O + + + + + Score + + Dynamics + Dynamik + + + &Config + &Inställningar + + + Page Settings + Sidinställningar + + + Staff Settings + Notsystem inställningar + + + Background Pixmap + Bakgrundsbild + + + Palettes + Palett + + + Print + Skriv ut + + + Preview Print + Förhandsgranska utskrift + + + Lyrics + Text + + + enter lyrics + skriv in text + + + Text + Text + + + enter text + skriv in Text + + + enter chord symbol + skriv in ackordsymbol + + + Score + Partitur + + + to previous voice + till föregående röst + + + to next voice + till nästa röst + + + flip stem direction + ändra stämriktning + + + move marked notes to previous voice or to upper stave in a split system + flytta de markerade noterna till föregående röst eller till övre notsystem i ett delat notssystem + + + move marked notes to next voice or to lower stave in a split system + flytta de markerade noterna till nästa röst eller undre notsystem i ett delat notsystem + + + flip stem direction of selected notes + byt stämriktning för valda noter + + + StaffSettings + Notsysteminställningar + + + MusE: config wallpaper + MusE: konfigurera bakgrundsbild + + + + ScoreConfig + + Staff Settings: + Partiturinställningar: + + + Track List + Spårlista + + + Key/Clef + Stämma/Klav + + + Upper Staff + Övre notplan + + + Lower Staff + Nedre notplan + + + Raster + Rutnät + + + Note Quantize + Notkvantisera + + + Rest Quantize + Restkvantisera + + + Mode + Läge + + + Split System + Delat system + + + Splitpoint + Delningspunkt + + + Apply + Verkställ + + + Cancel + Avbryt + + + + ScrollScale + + next page + nästa sida + + + previous page + förra sidan + + + current page number + nuvarande sidnummer + + + + ShortcutCaptureDialogBase + + Cancel + Avbryt + + + Enter shortcut sequence + + + + Press keys to enter shortcut sequence! + + + + Old shortcut: + + + + Undefined + + + + New shortcut: + + + + OK + OK + + + + ShortcutConfig + + Transport: Start playback from current location + Transport: Starta uppspelning från nuvarande position + + + Transport: Toggle metronome + Transport: Metronom av/på + + + Transport: Stop Playback + Transport: Stoppa uppspelning + + + Transport: Play, Stop, Rewind + Transport: Spela, stoppa, spola tillbaka + + + Transport: Goto left marker + Transport: Gå till vänster markering + + + Transport: Goto right marker + Transport: Gå till höger markering + + + Transport: Toggle Loop section + Transport: Loopa sektion av/på + + + Transport: Toggle Record + Transport: Inspelning av/på + + + Edit: Copy + Redigera: Kopiera + + + Edit: Undo + Redigera: Ångra + + + Edit: Redo + Redigera: Gör om + + + Edit: Cut + Redigera: Klipp ut + + + Edit: Paste, + Redigera: Klistra in + + + Edit: Delete + Redigera: Ta bort + + + File: New project + Arkiv: Nytt projekt + + + File: Open from disk + Arkiv: Öppna + + + File: Save project + Arkiv: Spara + + + File: Open recent file + Arkiv: Öppna föregående fil + + + File: Save as + Arkiv: Spara som + + + File: Load template + Arkiv: Ladda mall + + + File: Import midi file + Arkiv: Importera midifil + + + File: Export midi file + Arkiv: Exportera midifil + + + File: Import audio file + Arkiv: Importera ljudfil + + + File: Quit MusE + Arkiv: Avsluta + + + Edit: Select parts on track + Arkiv: Välj alla parter i spår + + + Open pianoroll + Öppna pianorulle + + + Open drumeditor + Öppna trumeditor + + + Open listeditor + Öppna listeditor + + + Open graphical mastertrack editor + Öppna masterspår-editor (grafisk) + + + Open list mastertrack editor + Öppna masterspår-editor (lista) + + + Open midi transformer + Öppna miditransformer + + + Add midi track + Lägg till midispår + + + Add drum track + Lägg till trumspår + + + Add wave track + Lägg till ljudspår + + + Add audio output + Lägg till ljudutgång + + + Add audio group + Lägg till ljudgrupp + + + Add audio input + Lägg till ljudingång + + + Add audio aux + Lägg till aux + + + Structure: Global cut + Struktur: Globalt klipp + + + Structure: Global insert + Struktur: Global insättning + + + Structure: Global split + Struktur: Global delning + + + Structure: Copy range + Struktur: Kopiera område + + + Structure: Cut events + Struktur: Klipp ut händelse + + + View: Open mixer window + Vy: Öppna mixerfönster + + + View: Toggle transport window + Vy: Transportfönster av/på + + + View: Toggle bigtime window + Vy: Bigtimefönster av/på + + + View: Open marker window + Vy: Öppna markörfönster + + + Settings: Follow song by page + Inställningar: Följ sång efter sida + + + Settings: Follow song off + Inställningar: Följ sång av + + + Settings: Follow song continuous + Inställningar: Följ sång kontinuerligt + + + Settings: Global configuration + Inställningar: Globala inställningar + + + Settings: Configure shortcuts + Inställningar: Konfigurera tangentbordsgenvängar + + + Settings: Configure metronome + Inställningar: Konfigurera metronom + + + Settings: Midi sync configuration + Inställningar: Midi synk konfigurationg + + + Settings: Midi file export configuration + Inställningar: Midi fil export-konfiguration + + + Settings: Appearance settings + Inställningar: Utseendeinställningar + + + Settings: Midi ports / Soft Synth + Inställningar: Midiportar / Mjukvarusynthar + + + Settings: Audio subsystem configuration + Inställningar: Konfiguration av ljud-undersystem + + + Midi: Edit midi instruments + Midi: Editera midi-instrument + + + Midi: Open midi input transform + Midi: Öppna midi inputtransformator + + + Midi: Open midi input filter + Midi: Öppna midi indatafilter + + + Midi: Midi input transpose + Midi: Midi indata transponering + + + Midi: Midi remote control + Midi: Midi fjärrkontroll + + + Midi: Random rhythm generator + Midi: Slumprymtmgenerator + + + Midi: Reset midi + Midi: Resetta midi + + + Midi: Init midi + Midi: Initiera midi + + + Midi: Midi local off + Midi: Midi lokal av + + + Audio: Bounce audio to track + Audio: Bounce till spår + + + Audio: Bounce audio to file + Audio: Bounce till fil + + + Audio: Restart audio + Audio: Starta om audio + + + Automation: Mixer automation + Audio: Mixerautomation + + + Automation: Take mixer snapshot + Audio: Mixer ögonblicksbild + + + Automation: Clear mixer automation + Audio: Rensa mixerautomation + + + Help: Open Manual + Hjälp: Öppna manual + + + Help: Toggle whatsthis mode + Hjälp: What's this-läge av/på + + + Edit: Edit selected part + Redigera: Editera vald part + + + Edit: Select nearest part on track above + Redigera: Välj närmsta part på ovanstående spår + + + Edit: Add nearest part on track above + Redigera: Lägg till närmsta part på ovanstående spår till val + + + Edit: Select nearest part on track below + Redigera: Välj närmsta part på underliggande spår + + + Edit: Add nearest part on track below + Redigera: Lägg till närmsta part på underliggande spår till val + + + Midi: Transpose + Midi: Transponering + + + Edit: Select all + Redigera: Välj alla + + + Edit: Select none + Redigera: Välj ingen + + + Edit: Invert selection + Redigera: Invertera val + + + Edit: Select events/parts inside locators + Redigera: Välj händelser/parter inom sektion + + + Edit: Select events/parts outside locators + Redigera: Välj händelser/parter utanför sektion + + + Edit: Select nearest part/event to the left + Redigera: Välj närmsta part/händelse till vänster + + + Edit: Add nearest part/event to the left to selection + Redigera: Lägg till närmsta part/händelse till vänster till val + + + Edit: Add nearest part/event to the right to selection + Redigera: Lägg till närmsta part/händelse till höger till val + + + Edit: Set locators to selection + Redigera: Sätt loopsektion till valda parter/händelser + + + Edit: Increase pitch + Redigera: Höj pitch + + + Edit: Decrease pitch + Redigera: Sänk pitch + + + Edit: Set fixed length on midi events + Redigera: Sätt fix längd till valda midihändelser + + + Quantize: Over Quantize + Redigera: Överkvantisera + + + Quantize: Note On Quantize + Kvantisering: Not på-kvantisering + + + Quantize: Note On/Off Quantize + Kvantisering: Not på/av-kvantisering + + + Quantize: Iterative Quantize + Kvantisering: Iterativ kvantisering + + + Quantize: Configure quant + Kvantisering: Konfigurera kvantisering + + + Quantize: Modify Gate Time + Kvantisering: Modifiera gate-tid + + + Quantize: Modify Velocity + Kvantisering: Modifiera velocity + + + Edit: Crescendo + Redigera: Crescendo + + + Edit: Thin Out + Redigera: Tunna ut + + + Edit: Erase Event + Redigera: Ta bort händelse + + + Edit: Note Shift + Redigera: Shifta Not + + + Edit: Move Clock + Redigera: Flytta Klocka + + + Edit: Copy Measure + Redigera: Kopiera Takt + + + Edit: Erase Measure + Redigera: Ta bort Takt + + + Edit: Delete Measure + Redigera: Ta bort Takt + + + Edit: Create Measure + Redigera: Lägg till Takt + + + Edit: Change event color + Redigera: Ändra färg på händelse + + + Tool: Pointer + Verktyg: Pekare + + + Tool: Pencil + Verktyg: Penna + + + Tool: Eraser + Verktyg: Radergummi + + + Tool: Line Draw + Verktyg: Rita linje + + + Tool: Scissor + Verktyg: Delare + + + Tool: Glue + Verktyg: Lim + + + Tool: Mute + Verktyg: Tysta + + + Transport: Increase current position + Transport: Öka nuvarande position + + + Transport: Decrease current position + Transport: Minska nuvarande position + + + Quantize: Set quantize to 1/1 note + Kvantisering: Sätt kvantisering till 1/1-not + + + Quantize: Set quantize to 1/2 note + Kvantisering: Sätt kvantisering till 1/2-not + + + Quantize: Set quantize to 1/4 note + Kvantisering: Sätt kvantisering till 1/4-not + + + Quantize: Set quantize to 1/8 note + Kvantisering: Sätt kvantisering till 1/8-not + + + Quantize: Set quantize to 1/16 note + Kvantisering: Sätt kvantisering till 1/16-not + + + Quantize: Set quantize to 1/32 note + Kvantisering: Sätt kvantisering till 1/32-not + + + Quantize: Set quantize to 1/64 note + Kvantisering: Sätt kvantisering till 1/64-not + + + Quantize: Toggle triol quantization + Kvantisering: Växla triol-kvantisering + + + Quantize: Toggle punctuation quantization + Kvantisering: Växla punktuerad kvantisering + + + Quantize: Toggle punctuation quantization (2) + Kvantisering: Växla punktuerad kvantisering (2) + + + Edit: Insert at location + Redigera: Sätt in på nuvarande position + + + Insert Note + Mata in Not + + + Insert SysEx + Mata in SysEx + + + Insert Ctrl + Mata in Ctrl + + + Insert Meta + Mata in Meta + + + Insert Channel Aftertouch + Mata in Aftertouch för kanal + + + Insert Key Aftertouch + Mata in Key Aftertouch + + + Edit: Increase event position + Redigera: Öka position för händelse + + + Edit: Decrease event position + Redigera: Minska position för händelse + + + Insert Tempo + Mata in Tempo + + + Insert Signature + Mata in tempo-signatur + + + Change Event Position + Ändra position för händelse + + + Edit Event Value + Redigera värde för händelse + + + Global + + + + Arranger + Arrangerare + + + Pianoroll + Pianorulle + + + Drumeditor + Trumeditor + + + List editor + + + + List Mastertrack + Masterspår, lista + + + All categories + Alla kategorier + + + + ShortcutConfigBase + + Configure Keyboard Shortcuts + + + + Shortcut Category + + + + Description + + + + Shortcut + + + + &Clear + + + + Alt+C + + + + &Define + + + + Alt+D + + + + &Apply + + + + Alt+A + Alt+L + + + + SigScale + + signature scale + signaturskala + + + + SimpleDrumsGuiBase + + DrumSynth 0.1 + + + + + StkGuiBase + + Voices + Röster + + + Edit + Redigera + + + + SynthConfigBase + + MusE: Soft Synth Configuration + MusE: Mjukvarusyntinställningar + + + Soft Synthesizer + Mjukvarusynt + + + File + Arkiv + + + Instances + Instanser + + + Name + Namn + + + list of available software synthesizers + lista av tillgängliga mjukvarusyntar + + + Add Instance + Lägg till instans + + + Remove Instance + Ta bort instans + + + + TList + + Show Gui + Visa Gui + + + Add Midi Track + Lägg till Midispår + + + Add Drum Track + Lägg till Trumspår + + + Add Wave Track + Lägg till Wavespår + + + Delete Track + Ta bort spår + + + Track Comment + Spårkommentar + + + Midi + Midi + + + Drum + Trumma + + + Wave + Wave + + + This is your first wave track and the project +doesn'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. + 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. + + + Save dialog + Spara dialog + + + Cancel + Avbryt + + + + TempoSig + + Tempo/Sig + + + + + Toolbar1 + + Cursor + Markör + + + Snap + Fäst vid + + + Quantize + Kvantisera + + + To + Till + + + All Events + Alla Händelser + + + Looped Ev. + Loopade Händelser. + + + Selected Ev. + Valda Händelser. + + + Looped+Sel. + Loopade och Valda. + + + + TrackComment + + MusE: Track Comment + MusE: Spårkommentar + + + Track Comment: + Spårkommentar: + + + + Transport + + Overdub + + + + Replace + Ersätt + + + Rec Mode + Recläge + + + Normal + + + + Mix + + + + Cycle Rec + + + + punchin + + + + loop + + + + punchout + + + + Punch In + + + + Loop + + + + Punch Out + + + + Left Mark + Vänster Markering + + + Right Mark + Höger Markering + + + rewind to start + flytta tillbaka till början + + + rewind + flytta tillbaka + + + forward + frammåt + + + stop + stopp + + + play + spela + + + record + spela in + + + AC + + + + quantize during record + kvantisera under inspelning + + + Click + + + + metronom click on/off + metronomklick av/på + + + Sync + Synk + + + external sync on/off + externsynk. av/på + + + Master + Master + + + use master track + använder masterspår + + + + TransposeDialogBase + + MusE: Midi Transpose + MusE: Miditransponering + + + Value + Värde + + + halftones + halvtoner + + + Time + Tid + + + all + alla + + + between markers + mellan markeringar + + + Parts + Parter + + + all in selected tracks + alla i valda spår + + + Cancel + Avbryt + + + OK + OK + + + + VAMGuiBase + + Virtual Analogue for MusE + Virtual Analogue för MusE + + + Waveform + Vågform + + + Sine + Sinus + + + Pulse + Puls + + + Saw + Sågtand + + + Triangle + Triangel + + + Filter + Filter + + + Invert + Invertera + + + Presets + Preset + + + load preset list + öppna presetlista + + + save preset list + spara presetlista + + + save preset list to a new file + spara presetlista till ny fil + + + delete preset + ta bort preset + + + Pitch + Tonhöjd + + + On + + + + + VelocityBase + + MusE: Modify Velocity + MusE: Modifiera Velocity + + + Range + Område + + + All Events + Alla Händelser + + + Selected Events + Valda Händelser + + + Looped Events + Loopade Händelser + + + Selected & Looped + Valda & Loopade + + + Values + Värden + + + Rate: + Hastighet: + + + Offset: + Offset: + + + Cancel + Avbryt + + + % + + + + OK + OK + + + + WTScale + + bar scale + takt-skala + + + + WaveEdit + + &File + &Arkiv + + + Functions + Funktioner + + + Normalize + Normalisera + + + Cursor + Markör + + + + WaveTrackInfoBase + + MusE: TrackInfo + MusE: Spårinfo + + + Track Info + Spårinfo + + + Track Name + Spårnamn + + + Ports: + Portar: + + + off + av + + + Track Delay (ticks) + + + + Delay + + + + Delay (Frames) + + + + 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 @@ + + + + + freeverb + + + + 0 + 0 + 398 + 120 + + + + FreeVerb + + + true + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Wet Level + + + + + + + + 4 + 0 + 0 + 0 + + + + 2 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Damping + + + + + + + + 4 + 0 + 0 + 0 + + + + 1 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 7 + 5 + 0 + 0 + + + + 1 + + + Qt::Vertical + + + + + + + + 7 + 5 + 0 + 0 + + + + 2 + + + Qt::Vertical + + + + + + + 0 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt;">Freeverb1</span></p></body></html> + + + + + + + Qt::Vertical + + + + 127 + 51 + + + + + + + + + + + 7 + 5 + 0 + 0 + + + + Qt::Vertical + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Room Size + + + + + + + + 4 + 0 + 0 + 0 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + qPixmapFromMimeSource + + + Awl::Slider + +

awl/slider.h
+ 0 + + + + Awl::FloatEntry + +
awl/floatentry.h
+ 0 + +
+ + + + 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 @@ + + + + + freeverb + + + + 0 + 0 + 721 + 335 + + + + FreeVerb + + + true + + + + 9 + + + 6 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Delay (ms) + + + + + + + + 4 + 0 + 0 + 0 + + + + 2700 + + + + + + + + 7 + 5 + 0 + 0 + + + + + 200 + 12 + 100 + + + + 2700 + + + 10 + + + 100 + + + Qt::Vertical + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Level + + + + + + + + 4 + 0 + 0 + 0 + + + + 1 + + + 50 + + + + + + + + 7 + 5 + 0 + 0 + + + + 1 + + + 50 + + + 0.5 + + + 2 + + + Qt::Vertical + + + + + + + + + + Sans Serif + 18 + 50 + false + false + false + false + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:18pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;"><span style=" font-size:18pt;">Left</span></p></body></html> + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Delay (ms) + + + + + + + + 4 + 0 + 0 + 0 + + + + 2 + + + 2700 + + + + + + + + 7 + 5 + 0 + 0 + + + + + 200 + 12 + 100 + + + + 2 + + + 2700 + + + 10 + + + 100 + + + Qt::Vertical + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Level + + + + + + + + 4 + 0 + 0 + 0 + + + + 3 + + + 50 + + + + + + + + 7 + 5 + 0 + 0 + + + + 4 + + + 3 + + + 50 + + + 0.5 + + + 2 + + + Qt::Vertical + + + + + + + + + + Sans Serif + 18 + 50 + false + false + false + false + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt;">Center</span></p></body></html> + + + + + + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt;">L/C/R Delay - 1436</span></p></body></html> + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 4 + 0 + 0 + 0 + + + + 9 + + + 50 + + + + + + + 9 + + + 50 + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Spread + + + + + + + Qt::Horizontal + + + + 101 + 20 + + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 4 + 0 + 0 + 0 + + + + 10 + + + + + + + 10 + + + 0.01 + + + 0.1 + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Dry/Wet level + + + + + + + Qt::Horizontal + + + + 101 + 20 + + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 4 + 0 + 0 + 0 + + + + 6 + + + -100 + + + 100 + + + + + + + 6 + + + -100 + + + 100 + + + 0.5 + + + 1 + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Feedback + + + + + + + Qt::Horizontal + + + + 101 + 20 + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Delay (ms) + + + + + + + + 4 + 0 + 0 + 0 + + + + 4 + + + 2700 + + + + + + + + 7 + 5 + 0 + 0 + + + + + 200 + 12 + 100 + + + + 4 + + + 2700 + + + 10 + + + 100 + + + Qt::Vertical + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Level + + + + + + + + 4 + 0 + 0 + 0 + + + + 5 + + + 50 + + + + + + + + 7 + 5 + 0 + 0 + + + + 5 + + + 50 + + + 0.5 + + + 2 + + + Qt::Vertical + + + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt;">Right</span></p></body></html> + + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 4 + 0 + 0 + 0 + + + + 7 + + + 100 + + + + + + + 7 + + + 100 + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + High frequency damping (%) + + + + + + + Qt::Horizontal + + + + 101 + 20 + + + + + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + + 4 + 0 + 0 + 0 + + + + 8 + + + 100 + + + + + + + 8 + + + 100 + + + Qt::Horizontal + + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Low frequency damping (%) + + + + + + + Qt::Horizontal + + + + 101 + 20 + + + + + + + + + + + + qPixmapFromMimeSource + + + Awl::Slider + +
awl/slider.h
+ 0 + +
+ + Awl::FloatEntry + +
awl/floatentry.h
+ 0 + +
+
+ + +
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 @@ + + + + + Form1 + + + + 0 + 0 + 357 + 190 + + + + Tap-Reverberator + + + + 11 + + + 10 + + + + + 0 + + + 4 + + + + + + 7 + 5 + 0 + 0 + + + + 8 + + + 1 + + + -70 + + + 10 + + + true + + + Qt::Horizontal + + + + + + + + 7 + 5 + 0 + 0 + + + + 8 + + + 10000 + + + Qt::Horizontal + + + + + + + + 4 + 0 + 0 + 0 + + + + 1 + + + -70 + + + 10 + + + + + + + Decay [ms] + + + + + + + + 5 + 0 + 0 + 0 + + + + + + + + Dry Level [dB] + + + + + + + + 7 + 5 + 0 + 0 + + + + 8 + + + 2 + + + -70 + + + 10 + + + true + + + Qt::Horizontal + + + + + + + + 4 + 0 + 0 + 0 + + + + 2 + + + + + + + Wet Level [dB] + + + + + + + + + 0 + + + 6 + + + + + Comb filters + + + 3 + + + + + + + Allpass filters + + + 4 + + + + + + + Bandpass filters + + + 5 + + + + + + + + + Enhanced stereo + + + 6 + + + + + + + 0 + + + 6 + + + + + + 4 + 5 + 0 + 0 + + + + Preset: + + + + + + + 7 + + + + AfterBurn + + + + + AfterBurn (Long) + + + + + Ambience + + + + + Ambience (Thick) + + + + + Ambience (Thick) - HD + + + + + Cathedral + + + + + Cathedral - HD + + + + + Drum Chamber + + + + + Garage + + + + + Garage (Bright) + + + + + Gymnasium + + + + + Gymnasium (Bright) + + + + + Gymnasium (Bright) - HD + + + + + Hall (Small) + + + + + Hall (Medium) + + + + + Hall (Large) + + + + + Hall (Large) - HD + + + + + Plate (Small) + + + + + Plate (Medium) + + + + + Plate (Large) + + + + + Plate (Large) - HD + + + + + Pulse Chamber + + + + + Pulse Chamber (Reverse) + + + + + Resonator (96 ms) + + + + + Resonator (152 ms) + + + + + Resonator (208 ms) + + + + + Room (Small) + + + + + Room (Medium) + + + + + Room (Large) + + + + + Room (Large) - HD + + + + + Slap Chamber + + + + + Slap Chamber - HD + + + + + Slap Chamber (Bright) + + + + + Slap Chamber (Bright) HD + + + + + Smooth Hall (Small) + + + + + Smooth Hall (Medium) + + + + + Smooth Hall (Large) + + + + + Smooth Hall (Large) - HD + + + + + Vocal Plate + + + + + Vocal Plate - HD + + + + + Warble Chamber + + + + + Warehoouse + + + + + Warehouse - HD + + + + + + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:15pt;">TAP Reverberator</span></p></body></html> + + + + + + + qPixmapFromMimeSource + + + Awl::Slider + +
awl/slider.h
+ 0 + +
+ + Awl::ComboBox + +
awl/combobox.h
+ 0 + +
+ + Awl::CheckBox + +
awl/checkbox.h
+ 0 + +
+ + Awl::FloatEntry + +
awl/floatentry.h
+ 0 + +
+
+ + +
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 @@ + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 127 + 127 + 1 + -1 + 1 + 00:00:00:00:00 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + + 1 + 298 764 + +
7 6 5 4 3 2 1 0
+
+ 0 + 266 + 1 +
+ + + 2 + 63 + 127 + 63 + 70 + 9 + 0 + 1 + 1 + 4 + 4 + 0 + 0 + 1 + 0 + + 0 + 28 + 31 + 33 + 29 + + + 96 + 96 + 600 + 400 + 50 + 300 + + + 96 + 96 + 80 + 50 + 0 + 0 + 600 + 400 + 0 + + + 0 + + + + 600 + 400 + +
+ + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + Track 1 + 0 + 0 + 0 + 0 + 1 + 20 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + + + + + + Track 2 + 0 + 0 + 0 + 0 + 1 + 20 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + + + + + + Track 3 + 0 + 0 + 0 + 0 + 1 + 20 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + + + + + + Track 4 + 0 + 0 + 0 + 0 + 1 + 20 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + + + + + + Group 1 + 0 + 0 + 0 + 0 + 1 + 20 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + + + + + + Group 2 + 0 + 0 + 0 + 0 + 1 + 20 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + + + + + + Aux 1 + 0 + 0 + 0 + 0 + 2 + 20 + 1 + 0 + 0 + 0 + 0 + 1 + + + + + + + Aux 2 + 0 + 0 + 0 + 0 + 2 + 20 + 1 + 0 + 0 + 0 + 0 + 1 + + + + + + + Input 1 + 0 + 1 + 0 + 0 + 2 + 20 + 1 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + + + + + + Out 1 + 0 + 0 + 0 + 0 + 2 + 20 + 1 + 0 + 0 + 0 + 0 + 1 + + + + + + + + 0 + 500000 + + + + + 0 + 4 + 4 + + + + + +
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 @@ + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 127 + 127 + 1 + -1 + 1 + 00:00:00:00:00 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + + + 2 + 63 + 127 + 63 + 70 + 9 + 0 + 0 + 0 + 4 + 4 + 0 + 0 + 1 + 0 + + 0 + 28 + 31 + 33 + 29 + + + 96 + 96 + 600 + 400 + 50 + 300 + 0 + + + 96 + 96 + 80 + 50 + 0 + 0 + 600 + 400 + 0 + + + 0 + + + + 600 + 400 + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + Out 1 + 0 + 0 + 0 + 0 + 2 + 20 + 0 + 1 + 0 + 1 + + + + + + + + 0 + 500000 + + + + + 0 + 4 + 4 + + + + + + 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 @@ + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 127 + 127 + 1 + -1 + 1 + 00:00:00:00:00 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + + 1 + 298 764 + +
7 6 5 4 3 2 1 0
+
+ 0 + 266 + 1 +
+ + + 2 + 63 + 127 + 63 + 70 + 9 + 0 + 1 + 1 + 4 + 4 + 0 + 0 + 1 + 0 + + 0 + 28 + 31 + 33 + 29 + + GM + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + 0 + + + 0 + + + 0 + + + + + + 96 + 96 + 600 + 400 + 50 + 300 + + + 96 + 96 + 80 + 50 + 0 + 0 + 600 + 400 + 0 + + + 0 + + + + 600 + 400 + +
+ + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + + Track 1 + 0 + 0 + 0 + 0 + 0 + 20 + 0 + 1 + 0 + 0 + 65535 + 65535 + 0 + 0 + 0 + 0 + 100 + 100 + 1 + + + Track 2 + 0 + 0 + 0 + 0 + 0 + 20 + 0 + 0 + 0 + 65535 + 65535 + 0 + 0 + 0 + 0 + 100 + 100 + 1 + + + Track 3 + 0 + 0 + 0 + 0 + 0 + 20 + 0 + 0 + 0 + 65535 + 65535 + 0 + 0 + 0 + 0 + 100 + 100 + 1 + + + Track 4 + 0 + 0 + 0 + 0 + 0 + 20 + 0 + 0 + 0 + 65535 + 65535 + 0 + 0 + 0 + 0 + 100 + 100 + 1 + + + Track 5 + 0 + 0 + 0 + 0 + 0 + 20 + 0 + 0 + 9 + 65535 + 65535 + 0 + 0 + 0 + 0 + 100 + 100 + 1 + + + + 0 + 500000 + + + + + 0 + 4 + 4 + + + + + +
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 @@ + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 127 + 127 + 1 + -1 + 1 + 00:00:00:00:00 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + + 0 + 298 296 + +
7 6 5 4 3 2 1 0
+
+ 0 + 266 + 1 +
+ + + 2 + 63 + 127 + 63 + 70 + 9 + 0 + 1 + 1 + 4 + 4 + 0 + 0 + 1 + 0 + + 0 + 28 + 31 + 33 + 29 + + GM + TASCAM US-X2Y Port 0 + 1 + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + + + 96 + 96 + 600 + 400 + 50 + 300 + + + 96 + 96 + 80 + 50 + 0 + 0 + 600 + 400 + 0 + + + 0 + + + + 600 + 400 + +
+ + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + Track 1 + 1 + 0 + 0 + 0 + 1 + 20 + 0 + 0 + 0 + 0 + 0 + 0.000000 + 0.000000 + + + + + + + Input 1 + 0 + 0 + 0 + 0 + 1 + 20 + 1 + 1 + 0 + 0 + 0 + 0 + 0.000000 + 0.000000 + + + + + + + Out 1 + 0 + 0 + 0 + 0 + 1 + 20 + 1 + 0 + 0 + 0 + 0 + + + + + + + alsa_pcm:capture_1 + 1:Input 1 + + + Input 1 + Out 1 + + + Input 1 + Track 1 + + + + 0 + 500000 + + + + + 0 + 4 + 4 + + + + + + + + + + + + + +
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 @@ + + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 127 + 127 + 1 + -1 + 1 + 00:00:00:00:00 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 0 + + 0 + 298 296 + +
7 6 5 4 3 2 1 0
+
+ 0 + 266 + 1 +
+ + + 2 + 63 + 127 + 63 + 70 + 9 + 0 + 1 + 1 + 4 + 4 + 0 + 0 + 1 + 0 + + 0 + 28 + 31 + 33 + 29 + + organ-1 + organ-1 + 0 + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + 1 + 7 + 10 + 11 + 64 + 91 + 93 + 120 + 121 + 123 + 262144 + 262145 + + + + fluid-1 + fluid-1 + 0 + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + + s1-1 + s1-1 + 0 + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + + vam-1 + vam-1 + 0 + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + 7 + 10 + 262145 + + + + + 96 + 96 + 600 + 400 + 50 + 300 + + + 96 + 96 + 80 + 50 + 0 + 0 + 600 + 400 + 0 + + + 0 + + + + 600 + 400 + +
+ + 0 + 12288 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 18432 + 1 + + Track 1 + 0 + 0 + 0 + 0 + 0 + 20 + 0 + 0 + 0 + 65535 + 65535 + 0 + 0 + 0 + 0 + 100 + 100 + 1 + + Track 1 + + 1 + 0 + + + + Out 1 + 0 + 0 + 0 + 0 + 2 + 20 + 0 + 1 + 0 + 0 + 0 + 0 + + + + + + + fluid-1 + 0 + 0 + 0 + 1 + 2 + 20 + 124 + 0 + 0 + 0 + 1 + + + + + fluid + 1 + 0 + + + 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 + + + + + organ-1 + 0 + 0 + 0 + 0 + 1 + 20 + 0 + 0 + 0 + 0 + 0 + + + + + organ + 0 + 0 + + + 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 + + + + + s1-1 + 0 + 0 + 0 + 1 + 1 + 20 + 11 + 0 + 0 + 0 + 1 + + + + + s1 + 2 + 0 + + + vam-1 + 0 + 0 + 0 + 1 + 1 + 20 + 0 + 0 + 0 + 0 + 1 + + + + + vam + 3 + 0 + + + 1:Out 1 + alsa_pcm:playback_1 + + + 2:Out 1 + alsa_pcm:playback_2 + + + fluid-1 + Out 1 + + + organ-1 + Out 1 + + + s1-1 + Out 1 + + + vam-1 + Out 1 + + + + 0 + 500000 + + + + + 0 + 4 + 4 + + + + + + + + + + + 0:0 + + + + + 96 + 96 + + 255 + 0 + 0 + 1 + 80 + 50 + 0 + 0 + 0 + 346 + 390 + 286 + + +
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 Binary files /dev/null and b/muse/share/wallpapers/gray.gif differ diff --git a/muse/share/wallpapers/gray_rock.gif b/muse/share/wallpapers/gray_rock.gif new file mode 100644 index 00000000..dcf1a19b Binary files /dev/null and b/muse/share/wallpapers/gray_rock.gif differ diff --git a/muse/share/wallpapers/gray_stucco.gif b/muse/share/wallpapers/gray_stucco.gif new file mode 100644 index 00000000..bcebdb02 Binary files /dev/null and b/muse/share/wallpapers/gray_stucco.gif differ diff --git a/muse/share/wallpapers/paper1.jpg b/muse/share/wallpapers/paper1.jpg new file mode 100644 index 00000000..1d4923e8 Binary files /dev/null and b/muse/share/wallpapers/paper1.jpg differ diff --git a/muse/share/wallpapers/stone1.gif b/muse/share/wallpapers/stone1.gif new file mode 100644 index 00000000..f45407cc Binary files /dev/null and b/muse/share/wallpapers/stone1.gif 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: 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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: <> +** 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 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 +// #include + +// #include + +#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) + (isetWindowTitle(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; kfindPreset(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((noteMAXNBRVOICES?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; keg[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; keg[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; kalgorithm!=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->lfoIndexlfoMaxIndex) + { + 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->lfoIndexlfoMaxIndex?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; jwriteEvent(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(*_gui->tColor)); + xml->colorTag(BACKGROUNDCOLORSTR, + reinterpret_cast(*_gui->bColor)); + xml->colorTag(EDITTEXTCOLORSTR, + reinterpret_cast(*_gui->etColor)); + xml->colorTag(EDITBACKGROUNDCOLORSTR, + reinterpret_cast(*_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; iwriteEvent(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_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; iwriteEvent(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 && ctrlCTRL_PL3 && ctrlsetIsUsed(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(p_preset->name.c_str()); + return tempName; + } +} + +//--------------------------------------------------------- +// getPatchInfo +//--------------------------------------------------------- + +const MidiPatch* DeicsOnze::getPatchInfo(int /*ch*/, const MidiPatch* /*p*/) const { + /*if(_numPatch= 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; ieg[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; isensitivity.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; ksensitivity.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(*tColor)); + setBackgroundColor(reinterpret_cast(*bColor)); + setEditTextColor(reinterpret_cast(*etColor)); + setEditBackgroundColor(reinterpret_cast(*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(*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(*curColor)); + } + else if(i->text()==QString("Background")) { + bColor->setRgb(curColor->rgb()); + setBackgroundColor(reinterpret_cast(*curColor)); + } + else if(i->text()==QString("Edit Text")) { + etColor->setRgb(curColor->rgb()); + setEditTextColor(reinterpret_cast(*curColor)); + } + else if(i->text()==QString("Edit Background")) { + ebColor->setRgb(curColor->rgb()); + setEditBackgroundColor(reinterpret_cast(*curColor)); + } + QPalette p = colorFrame->palette(); + p.setColor(QPalette::Window, + (reinterpret_cast(*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(*curColor)); + } + else if(i->text()==QString("Background")) { + bColor->setRgb(curColor->rgb()); + setBackgroundColor(reinterpret_cast(*curColor)); + } + else if(i->text()==QString("Edit Text")) { + etColor->setRgb(curColor->rgb()); + setEditTextColor(reinterpret_cast(*curColor)); + } + else if(i->text()==QString("Edit Background")) { + ebColor->setRgb(curColor->rgb()); + setEditBackgroundColor(reinterpret_cast(*curColor)); + } + QPalette p = colorFrame->palette(); + p.setColor(QPalette::Window, (reinterpret_cast(*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(*curColor)); + } + else if(i->text()==QString("Background")) { + bColor->setRgb(curColor->rgb()); + setBackgroundColor(reinterpret_cast(*curColor)); + } + else if(i->text()==QString("Edit Text")) { + etColor->setRgb(curColor->rgb()); + setEditTextColor(reinterpret_cast(*curColor)); + } + else if(i->text()==QString("Edit Background")) { + ebColor->setRgb(curColor->rgb()); + setEditBackgroundColor(reinterpret_cast(*curColor)); + } + QPalette p = colorFrame->palette(); + p.setColor(QPalette::Window, (reinterpret_cast(*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(*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()x()>startlinkP1.x()-DRAGWIDTH + && e->y()y()>startlinkP1.y()-DRAGWIDTH) + isStartlinkP1Edit=true; + //P1linkP2 + if(e->x()x()>P1linkP2.x()-DRAGWIDTH + && e->y()y()>P1linkP2.y()-DRAGWIDTH) + isP1linkP2Edit=true; + //P2linkP3 + if(e->x()x()>P2linkP3.x()-DRAGWIDTH + && e->y()y()>P2linkP3.y()-DRAGWIDTH) + isP2linkP3Edit=true; + //P3linkEnd + if(e->x()x()>P3linkEnd.x()-DRAGWIDTH + && e->y()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()PL1SpinBox->stepUp(); + } + if(isP1linkP2Edit) { + if(e->x()>P1linkP2.x()) _deicsOnzeGui->PR1SpinBox->stepDown(); + if(e->x()PR1SpinBox->stepUp(); + if(e->y()>P1linkP2.y()) _deicsOnzeGui->PL2SpinBox->stepDown(); + if(e->y()PL2SpinBox->stepUp(); + } + if(isP2linkP3Edit) { + if(e->x()>P2linkP3.x()) _deicsOnzeGui->PR2SpinBox->stepDown(); + if(e->x()PR2SpinBox->stepUp(); + if(e->y()>P2linkP3.y()) _deicsOnzeGui->PL3SpinBox->stepDown(); + if(e->y()PL3SpinBox->stepUp(); + } + if(isP3linkEndEdit) { + if(e->x()>P3linkEnd.x()) _deicsOnzeGui->PR3SpinBox->stepDown(); + if(e->x()PR3SpinBox->stepUp(); + if(e->y()>P3linkEnd.y()) _deicsOnzeGui->PL1SpinBox->stepDown(); + if(e->y()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()x()>ARlinkD1.x()-DRAGWIDTH + && e->y()y()>ARlinkD1.y()-DRAGWIDTH) + isARlinkD1Edit=true; + //D1linkD2 + if(e->x()x()>D1linkD2.x()-DRAGWIDTH + && e->y()y()>D1linkD2.y()-DRAGWIDTH) + isD1linkD2Edit=true; + //D2linkRR + if(e->x()x()>D2linkRR.x()-DRAGWIDTH + && e->y()y()>D2linkRR.y()-DRAGWIDTH) + isD2linkRREdit=true; + //RRlinkEnd + if(e->x()x()>RRlinkEnd.x()-DRAGWIDTH + && e->y()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()AR1SpinBox->stepUp(); + break; + case 1 : + if(e->x()>ARlinkD1.x()) _deicsOnzeGui->AR2SpinBox->stepDown(); + if(e->x()AR2SpinBox->stepUp(); + break; + case 2 : + if(e->x()>ARlinkD1.x()) _deicsOnzeGui->AR3SpinBox->stepDown(); + if(e->x()AR3SpinBox->stepUp(); + break; + case 3 : + if(e->x()>ARlinkD1.x()) _deicsOnzeGui->AR4SpinBox->stepDown(); + if(e->x()AR4SpinBox->stepUp(); + break; + default : + break; + } + } + if(isD1linkD2Edit) + { + switch(op) { + case 0 : + if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R1SpinBox->stepDown(); + if(e->x()D1R1SpinBox->stepUp(); + if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L1SpinBox->stepDown(); + if(e->y()D1L1SpinBox->stepUp(); + break; + case 1 : + if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R2SpinBox->stepDown(); + if(e->x()D1R2SpinBox->stepUp(); + if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L2SpinBox->stepDown(); + if(e->y()D1L2SpinBox->stepUp(); + break; + case 2 : + if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R3SpinBox->stepDown(); + if(e->x()D1R3SpinBox->stepUp(); + if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L3SpinBox->stepDown(); + if(e->y()D1L3SpinBox->stepUp(); + break; + case 3 : + if(e->x()>D1linkD2.x()) _deicsOnzeGui->D1R4SpinBox->stepDown(); + if(e->x()D1R4SpinBox->stepUp(); + if(e->y()>D1linkD2.y()) _deicsOnzeGui->D1L4SpinBox->stepDown(); + if(e->y()D1L4SpinBox->stepUp(); + break; + default : + break; + } + } + if(isD2linkRREdit) + { + switch(op) { + case 0 : + if(e->x()>D2linkRR.x() /*&& e->y()D2R1SpinBox->stepDown(); + if(e->x()y()>D2linkRR.y()*/) + _deicsOnzeGui->D2R1SpinBox->stepUp(); + break; + case 1 : + if(e->x()>D2linkRR.x() /*&& e->y()D2R2SpinBox->stepDown(); + if(e->x()y()>D2linkRR.y()*/) + _deicsOnzeGui->D2R2SpinBox->stepUp(); + break; + case 2 : + if(e->x()>D2linkRR.x() /*&& e->y()D2R3SpinBox->stepDown(); + if(e->x()y()>D2linkRR.y()*/) + _deicsOnzeGui->D2R3SpinBox->stepUp(); + break; + case 3 : + if(e->x()>D2linkRR.x() /*&& e->y()D2R4SpinBox->stepDown(); + if(e->x()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()RR1SpinBox->stepUp(); + break; + case 1 : + if(e->x()>RRlinkEnd.x()) _deicsOnzeGui->RR2SpinBox->stepDown(); + if(e->x()RR2SpinBox->stepUp(); + break; + case 2 : + if(e->x()>RRlinkEnd.x()) _deicsOnzeGui->RR3SpinBox->stepDown(); + if(e->x()RR3SpinBox->stepUp(); + break; + case 3 : + if(e->x()>RRlinkEnd.x()) _deicsOnzeGui->RR4SpinBox->stepDown(); + if(e->x()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(*tColor)); + setBackgroundColor(reinterpret_cast(*bColor)); + setEditTextColor(reinterpret_cast(*etColor)); + setEditBackgroundColor(reinterpret_cast(*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::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::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::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; keg[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 @@ + + Nil Geisweiller + + + DeicsOnzeGuiBase + + + + 0 + 0 + 544 + 570 + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + DeicsOnze + + + false + + + false + + + + 9 + + + 6 + + + + + + 16 + 104 + + + + Quick Edit + + + + 9 + + + 6 + + + + + + + + QFrame::StyledPanel + + + Detune + + + Qt::AlignCenter + + + + + + + + + + QFrame::StyledPanel + + + Attack + + + Qt::AlignCenter + + + + + + + QFrame::StyledPanel + + + Release + + + Qt::AlignCenter + + + + + + + + + + + + + QFrame::StyledPanel + + + Modulation + + + Qt::AlignCenter + + + + + + + QFrame::StyledPanel + + + Current preset + + + Qt::AlignCenter + + + + + + + QFrame::StyledPanel + + + Volume + + + Qt::AlignCenter + + + + + + + 1 + + + 0.1 + + + 0.2 + + + 270 + + + 6 + + + + + + + + + + QFrame::StyledPanel + + + Brightness + + + Qt::AlignCenter + + + + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + QFrame::StyledPanel + + + INITVOICE + + + Qt::AlignCenter + + + + + + + + + + + 7 + 7 + 0 + 0 + + + + 0 + + + + + + false + + + QTabWidget::Rounded + + + + &Presets + + + + 9 + + + 6 + + + + + false + + + INITVOICE + + + 12 + + + + + + + + Sans Serif + 8 + 50 + false + false + false + false + + + + QFrame::NoFrame + + + QFrame::Plain + + + DeicsOnze v0.3 Copyright (c) 2004-2006 Nil Geisweiller. Published under GPL licence. + + + + + + + Qt::CustomContextMenu + + + false + + + + LBank + + + + + Subcategory + + + + + + + + Qt::CustomContextMenu + + + false + + + + Prog + + + + + Preset + + + + + + + + Qt::CustomContextMenu + + + Qt::LeftToRight + + + false + + + QFrame::StyledPanel + + + QFrame::Sunken + + + 1 + + + 0 + + + false + + + true + + + 2 + + + + HBank + + + + + Category + + + + + + + + false + + + Program numerous + + + 128 + + + 1 + + + + + + + false + + + NONE + + + 12 + + + + + + + false + + + Bank numerous + + + 128 + + + 1 + + + + + + + false + + + NONE + + + 12 + + + + + + + false + + + Bank numerous + + + 128 + + + 1 + + + + + + + + &Global + + + + 9 + + + 6 + + + + + Pitch Envelope + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + PL3 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PL2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PL1 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PR1 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PR2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PR3 + + + + + + + 13 + + + true + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + Pitch modulation depth + + + 99 + + + 2 + + + 50 + + + + + + + Pitch modulation depth + + + 99 + + + 2 + + + 50 + + + + + + + Pitch modulation depth + + + 99 + + + 2 + + + 50 + + + + + + + Pitch modulation depth + + + 99 + + + 3 + + + 0 + + + + + + + Pitch modulation depth + + + 99 + + + 3 + + + 0 + + + + + + + Pitch modulation depth + + + 99 + + + 3 + + + 0 + + + + + + + + + + LFO + + + + 10 + + + 6 + + + + + 13 + + + LFO Sync + + + + + + + Pitch modulation sensitivity + + + 7 + + + + + + + 13 + + + Pitch Modulation Sensitivity + + + 7 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + 13 + + + LFO Delay + + + 99 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + LFO delay + + + 99 + + + + + + + LFO speed + + + 99 + + + + + + + Amplitude modulation depth + + + 99 + + + + + + + Pitch modulation depth + + + 99 + + + + + + + Amplitude modulation sensitivity + + + 7 + + + + + + + 13 + + + Amplitude Modulation Sensitivity + + + 3 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + QFrame::Box + + + QFrame::Sunken + + + AMS + + + + + + + 13 + + + LFO Waveform + + + + + + + pics/sawUp.png + + + + + + + + pics/square.png + + + + + + + + pics/triangl.png + + + + + + + + pics/SHold.png + + + + + + + + 13 + + + Pitch Modulation Depth + + + 99 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PMD + + + + + + + 13 + + + LFO Speed + + + 99 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + 13 + + + Pitch Modulation Depth + + + 99 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + QFrame::Box + + + QFrame::Sunken + + + AMD + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Speed + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Delay + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PMS + + + + + + + + + + true + + + Modulation Matrix + + + + 10 + + + 6 + + + + + 13 + + + Modulation Matrix + + + <b>Algorithm 1</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 2</b> : <i>Op 1</i> modulated by <i>Op 2</i> modulated by both <i>Op 3</i> and <i>Op 4</i><br> +<b>Algorithm 3</b> : <i>Op 1</i> modulated by both <i>Op 4</i> and <i>Op 2</i> modulated by <i>Op 3</i><br> +<b>Algorithm 4</b> : <i>Op 1</i> modulated by both <i>Op 2</i> and <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 5</b> : (<i>Op 1</i> modulated by <i>Op 2</i>) add to (<i>Op 3</i> modulated by <i>Op 4</i>) <br> +<b>Algorithm 6</b> : addition of the three <i>Op 1, 2, 3</i> all modulated by <i>Op 4</i><br> +<b>Algorithm 7</b> : addition of the three <i>Op 1, 2, 3</i> with <i>Op 3</i> modulated by <i>Op 4</i><br> +<b>Algorithm 8</b> : addition of the four <i>Op 1, 2, 3, 4</i> + + + + Algo1 + + + pics/algo1.png + + + + + Algo2 + + + pics/algo3.png + + + + + Algo3 + + + pics/algo3.png + + + + + Algo4 + + + pics/algo4.png + + + + + Algo5 + + + pics/algo5.png + + + + + Algo6 + + + pics/algo6.png + + + + + Algo7 + + + pics/algo7.png + + + + + Algo8 + + + pics/algo8.png + + + + + + + + + + + Master Volume + + + + 10 + + + 6 + + + + + 13 + + + Master Volume + + + 255 + + + 64 + + + Qt::Horizontal + + + + + + + Master volume + + + 255 + + + 64 + + + + + + + + + + + + + Op4 Feedback + + + + 10 + + + 6 + + + + + 13 + + + Feedback level of the operator 4 + + + 7 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + Feedback level of the operator 4 + + + 7 + + + + + + + + + + + Op &1 + + + + 9 + + + 6 + + + + + Scaling 1 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + LS1 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + RS1 + + + + + + + 13 + + + Rate Scaling + + + Attack Rate of the operator 1 + + + 3 + + + 1 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + 13 + + + Level Scaling + + + Attack Rate of the operator 1 + + + 99 + + + 1 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + Level Scaling + + + 99 + + + + + + + Rate Scaling + + + 3 + + + + + + + + + + Amplitude Envelope 1 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + RR1 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1R1 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1L1 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D2R1 + + + + + + + Release Rate + + + 15 + + + + + + + 2° Decay Rate + + + 31 + + + + + + + 1° Decay Level + + + 15 + + + + + + + 1° Decay Rate + + + 31 + + + + + + + Attack Rate + + + 31 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + AR1 + + + + + + + + 7 + 7 + 0 + 0 + + + + 13 + + + true + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + + + Detune, OSCWave, EGShift 1 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + DET1 + + + + + + + Detune + + + 3 + + + -3 + + + + + + + 13 + + + Detune + + + Attack Rate of the operator 1 + + + -3 + + + 3 + + + 1 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + false + + + 13 + + + EG Shift + + + + 96dB + + + + + 48dB + + + + + 24dB + + + + + 12dB + + + + + + + + 13 + + + Wave form + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + + + + pics/wave1.png + + + + + + + + pics/wave2.png + + + + + + + + pics/wave3.png + + + + + + + + pics/wave4.png + + + + + + + + pics/wave5.png + + + + + + + + pics/wave6.png + + + + + + + + pics/wave7.png + + + + + + + + pics/wave8.png + + + + + + + + + + + Sensitivity 1 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + KVS1 + + + + + + + 13 + + + Amplitude Modulation Enable + + + AME1 + + + + + + + Keyboard Velocity Sensitivity + + + 7 + + + + + + + 13 + + + false + + + Key Velocity Sensitivity + + + 7 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + QFrame::Box + + + QFrame::Sunken + + + EBS1 + + + + + + + 13 + + + EG Bias Sensitivity + + + 7 + + + 1 + + + 1 + + + Qt::Horizontal + + + + + + + Eg Bias Sensitivity + + + 7 + + + + + + + + + + Frequency 1 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + Coarse 1 + + + + + + + Coarse Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Fine 1 + + + + + + + Fine Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Freq 1 + + + + + + + false + + + Fixed Frequency + + + 32000 + + + + + + + true + + + 13 + + + Toggle Fix Frequency + + + FIX + + + + + + + + + + OUT 1 + + + + 10 + + + 6 + + + + + Output Volume + + + 99 + + + + + + + 13 + + + Volume + + + + + + 99 + + + 1 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + + + + + Op &2 + + + + 9 + + + 6 + + + + + Amplitude Envelope 2 + + + + 10 + + + 6 + + + + + Attack Rate + + + 31 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1R2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1L2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D2R2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + RR2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + AR2 + + + + + + + Release Rate + + + 15 + + + + + + + 2° Decay Rate + + + 31 + + + + + + + 1° Decay Level + + + 15 + + + + + + + 1° Decay Rate + + + 31 + + + + + + + + 7 + 7 + 0 + 0 + + + + 13 + + + true + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + + + Frequency 2 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + Coarse 2 + + + + + + + Coarse Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Fine 2 + + + + + + + Fine Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Freq 2 + + + + + + + false + + + Fixed Frequency + + + 32000 + + + + + + + true + + + 13 + + + Toggle Fix Frequency + + + FIX + + + + + + + + + + Scaling 2 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + LS2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + RS2 + + + + + + + 13 + + + Level Scaling + + + Attack Rate of the operator 1 + + + 99 + + + 1 + + + 0 + + + Qt::Vertical + + + 1 + + + + + + + 13 + + + Rate Scaling + + + Attack Rate of the operator 1 + + + 3 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + Level Scaling + + + 99 + + + + + + + Rate Scaling + + + 3 + + + + + + + + + + OUT 2 + + + + 10 + + + 6 + + + + + Output Volume + + + 99 + + + + + + + 13 + + + Volume + + + + + + 99 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + + + + Detune, OSCWave, EGShift 2 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + DET2 + + + + + + + Detune + + + 3 + + + -3 + + + + + + + 13 + + + Detune + + + Attack Rate of the operator 1 + + + -3 + + + 3 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + false + + + 13 + + + EG Shift + + + + 96dB + + + + + 48dB + + + + + 24dB + + + + + 12dB + + + + + + + + 13 + + + Wave form + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + + + + pics/wave1.png + + + + + + + + pics/wave2.png + + + + + + + + pics/wave3.png + + + + + + + + pics/wave4.png + + + + + + + + pics/wave5.png + + + + + + + + pics/wave6.png + + + + + + + + pics/wave7.png + + + + + + + + pics/wave8.png + + + + + + + + + + + Sensitivity 2 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + EBS2 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + KVS2 + + + + + + + 13 + + + Amplitude Modulation Enable + + + AME2 + + + + + + + 13 + + + false + + + Key Velocity Sensitivity + + + 7 + + + 1 + + + Qt::Horizontal + + + + + + + Keyboard Velocity Sensitivity + + + 7 + + + + + + + 13 + + + EG Bias Sensitivity + + + 7 + + + 1 + + + Qt::Horizontal + + + + + + + Eg Bias Sensitivity + + + 7 + + + + + + + + + + + Op &3 + + + + 9 + + + 6 + + + + + Amplitude Envelope 3 + + + + 10 + + + 6 + + + + + Attack Rate + + + 31 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1R3 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1L3 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D2R3 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + RR3 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + AR3 + + + + + + + Release Rate + + + 15 + + + + + + + 2° Decay Rate + + + 31 + + + + + + + 1° Decay Level + + + 15 + + + + + + + 1° Decay Rate + + + 31 + + + + + + + + 7 + 7 + 0 + 0 + + + + 13 + + + true + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + + + Scaling 3 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + LS3 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + RS3 + + + + + + + 13 + + + Level Scaling + + + Attack Rate of the operator 1 + + + 99 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + 13 + + + Rate Scaling + + + Attack Rate of the operator 1 + + + 3 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + Level Scaling + + + 99 + + + + + + + Rate Scaling + + + 3 + + + + + + + + + + OUT 3 + + + + 10 + + + 6 + + + + + Output Volume + + + 99 + + + + + + + 13 + + + Volume + + + + + + 99 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + + + + Frequency 3 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + Coarse 3 + + + + + + + 0 + + + Coarse Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Fine 3 + + + + + + + 0 + + + Fine Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Freq 3 + + + + + + + false + + + Fixed Frequency + + + 32000 + + + + + + + true + + + 13 + + + Toggle Fix Frequency + + + FIX + + + + + + + + + + Detune, OSCWave, EGShift 3 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + DET3 + + + + + + + Detune + + + 3 + + + -3 + + + + + + + 13 + + + Detune + + + Attack Rate of the operator 1 + + + -3 + + + 3 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + false + + + 13 + + + EG Shift + + + + 96dB + + + + + 48dB + + + + + 24dB + + + + + 12dB + + + + + + + + 13 + + + Wave form + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + + + + pics/wave1.png + + + + + + + + pics/wave2.png + + + + + + + + pics/wave3.png + + + + + + + + pics/wave4.png + + + + + + + + pics/wave5.png + + + + + + + + pics/wave6.png + + + + + + + + pics/wave7.png + + + + + + + + pics/wave8.png + + + + + + + + + + + Sensitivity 3 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + EBS3 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + KVS3 + + + + + + + 13 + + + Amplitude Modulation Enable + + + AME3 + + + + + + + 13 + + + false + + + Key Velocity Sensitivity + + + 7 + + + 1 + + + Qt::Horizontal + + + + + + + Keyboard Velocity Sensitivity + + + 7 + + + + + + + 13 + + + EG Bias Sensitivity + + + 7 + + + 1 + + + Qt::Horizontal + + + + + + + Eg Bias Sensitivity + + + 7 + + + + + + + + + + + Op &4 + + + + 9 + + + 6 + + + + + amplitude Envelope 4 + + + + 10 + + + 6 + + + + + Attack Rate + + + 31 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + AR4 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1R4 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D1L4 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + D2R4 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + RR4 + + + + + + + Release Rate + + + 15 + + + + + + + 2° Decay Rate + + + 31 + + + + + + + 1° Decay Level + + + 15 + + + + + + + 1° Decay Rate + + + 31 + + + + + + + + 7 + 7 + 0 + 0 + + + + 13 + + + true + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + + + Frequency 4 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + Coarse 4 + + + + + + + Coarse Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Fine 4 + + + + + + + Fine Ratio + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Freq 4 + + + + + + + false + + + Fixed Frequency + + + 32000 + + + + + + + true + + + 13 + + + Toggle Fix Frequency + + + FIX + + + + + + + + + + Scaling 4 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + LS4 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + RS4 + + + + + + + 13 + + + Level Scaling + + + Attack Rate of the operator 1 + + + 99 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + 13 + + + Rate Scaling + + + Attack Rate of the operator 1 + + + 3 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + Level Scaling + + + 99 + + + + + + + Rate Scaling + + + 3 + + + + + + + + + + OUT 4 + + + + 10 + + + 6 + + + + + Output Volume + + + 99 + + + + + + + 13 + + + Volume + + + + + + 99 + + + 1 + + + 0 + + + Qt::Vertical + + + + + + + + + + Detune, OSCWave, EGShift 4 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + DET4 + + + + + + + Detune + + + 3 + + + -3 + + + + + + + 13 + + + Detune + + + Attack Rate of the operator 1 + + + -3 + + + 3 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + false + + + 13 + + + EG Shift + + + + 96dB + + + + + 48dB + + + + + 24dB + + + + + 12dB + + + + + + + + 13 + + + Wave form + + + Wave form 1 = <i>sin(<b>t</b>)</i><br> +Wave form 2 = <i>sin(<b>t</b>)*abs(sin(<b>t</b>))</i><br> +Wave form 3 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>) else 0</i><br> +Wave form 4 = <i>if <b>t</b>&#060 pi then sin(<b>t</b>)*abs(sin(<b>t</b>)) else 0</i><br> +Wave form 5 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>) else 0</i><br> +Wave form 6 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 7 = <i>if <b>t</b>&#060 pi then abs(sin(2*<b>t</b>)) else 0</i><br> +Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin(2*<b>t</b>) else 0</i> + + + + + + + pics/wave1.png + + + + + + + + pics/wave2.png + + + + + + + + pics/wave3.png + + + + + + + + pics/wave4.png + + + + + + + + pics/wave5.png + + + + + + + + pics/wave6.png + + + + + + + + pics/wave7.png + + + + + + + + pics/wave8.png + + + + + + + + + + + Sensitivity 4 + + + + 10 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + EBS4 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + KVS4 + + + + + + + 13 + + + Amplitude Modulation Enable + + + AME4 + + + + + + + 13 + + + false + + + Key Velocity Sensitivity + + + 7 + + + 1 + + + Qt::Horizontal + + + + + + + Keyboard Velocity Sensitivity + + + 7 + + + + + + + 13 + + + EG Bias Sensitivity + + + 7 + + + 1 + + + Qt::Horizontal + + + + + + + Eg Bias Sensitivity + + + 7 + + + + + + + + + + + &Functions + + + + 9 + + + 6 + + + + + + Foot Control + + + + 9 + + + 6 + + + + + Pitch Bend Range + + + 99 + + + + + + + Pitch Bend Range + + + 99 + + + + + + + Pitch Bend Range + + + 99 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Pitch + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Amplitude + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Volume + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + + Modulation Wheel + + + + 9 + + + 6 + + + + + Pitch Bend Range + + + 99 + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + Pitch Bend Range + + + 99 + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Amplitude + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Pitch + + + + + + + + Breath Control + + + + 9 + + + 6 + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 50 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + Pitch Bend Range + + + 50 + + + + + + + Pitch Bend Range + + + 99 + + + + + + + Pitch Bend Range + + + 99 + + + + + + + Pitch Bend Range + + + 99 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Pitch + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Pitch Bias + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Envelope Bias + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Amplitude + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + + After Touch + + + + 9 + + + 6 + + + + + QFrame::Box + + + QFrame::Sunken + + + Pitch + + + + + + + Pitch Bend Range + + + 99 + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + Pitch Bend Range + + + 50 + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 50 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + Pitch Bend Range + + + 99 + + + + + + + Pitch Bend Range + + + 99 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Pitch Bias + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Amplitude + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Envelope Bias + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + + + + + Phony Mode + + + + 10 + + + 6 + + + + + false + + + 13 + + + + POLY + + + + + MONO + + + + + + + + + + + Reverb + + + + 10 + + + 6 + + + + + 13 + + + Detune + + + 0 + + + 7 + + + 1 + + + Qt::Horizontal + + + + + + + Detune + + + 7 + + + 0 + + + + + + + + + + Detune + + + + 10 + + + 6 + + + + + 13 + + + Detune + + + -31 + + + 31 + + + 1 + + + Qt::Horizontal + + + + + + + Detune + + + 31 + + + -31 + + + + + + + + + + Potamento + + + + 10 + + + 6 + + + + + false + + + 13 + + + Portamento Mode + + + + FINGER + + + + + FULL + + + + + + + + QFrame::Box + + + QFrame::Sunken + + + PT + + + + + + + false + + + 13 + + + Portamento Time + + + 0 + + + 99 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + false + + + Portamento Time + + + 99 + + + + + + + + + + Pitch Bend Range + + + + 10 + + + 6 + + + + + 13 + + + Pitch Bend Range + + + 0 + + + 12 + + + 1 + + + 0 + + + Qt::Horizontal + + + + + + + Pitch Bend Range + + + 12 + + + + + + + + + + Foot Switch + + + + 10 + + + 6 + + + + + false + + + + Sustain + + + + + Portamento + + + + + + + + + + + Transpose + + + + 10 + + + 6 + + + + + 13 + + + Transpose + + + -24 + + + 24 + + + 1 + + + Qt::Horizontal + + + + + + + Transpose + + + 99 + + + -24 + + + + + + + + + + + &Configure + + + + 9 + + + 6 + + + + + Colors + + + + 9 + + + 6 + + + + + + 7 + 7 + 0 + 0 + + + + + 0 + 20 + + + + true + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + + + Text + + + + + Background + + + + + Edit Text + + + + + Edit Background + + + + + + + + Red + + + 255 + + + + + + + 13 + + + Blue + + + 255 + + + Qt::Horizontal + + + + + + + 13 + + + Green + + + 255 + + + Qt::Horizontal + + + + + + + 13 + + + Red + + + Qt::LeftToRight + + + 255 + + + Qt::Horizontal + + + QSlider::NoTicks + + + + + + + Blue + + + 255 + + + + + + + Green + + + 255 + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Blue + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Green + + + + + + + QFrame::Box + + + QFrame::Sunken + + + Red + + + + + + + + + + Save Mode (into the song) + + + + 10 + + + 6 + + + + + 13 + + + Save only the used presets + + + true + + + + + + + 13 + + + Save the entire set + + + + + + + 13 + + + Save the configuration + + + true + + + + + + + + + + Configuration File + + + + 9 + + + 6 + + + + + true + + + Save... + + + + + + + true + + + Load... + + + + + + + Save as default + + + + + + + + + + Set Path + + + + 9 + + + 6 + + + + + Load the following set at the initialization : + + + true + + + + + + + Browse... + + + + + + + 128 + + + + + + + + + + Nbr Voices + + + + 10 + + + 6 + + + + + true + + + Number of Voices + + + 64 + + + 1 + + + 8 + + + + + + + + + + Quality + + + + 10 + + + 6 + + + + + false + + + + High + + + + + Middle + + + + + Low + + + + + + + + + + + Midi Input Ch + + + + 10 + + + 6 + + + + + true + + + + All + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + + + + + + + + + + + + + + Awl::Knob + +
awl/knob.h
+ 0 + +
+
+ + deicsOnzeTabWidget + presetLineEdit + masterVolSlider + feedbackSlider + LFOSyncCheckBox + PModSensSlider + LFOWaveComboBox + AModSensSlider + PModDepthSlider + AModDepthSlider + LFOSpeedSlider + LFODelaySlider + algorithmComboBox + LS1Slider + RS1Slider + OUT1Slider + Fix1CheckBox + AME1CheckBox + EBS1Slider + DET1Slider + KVS1Slider + WaveForm1ComboBox + EGS1ComboBox + LS2Slider + RS2Slider + OUT2Slider + AME2CheckBox + EBS2Slider + DET2Slider + KVS2Slider + WaveForm2ComboBox + EGS2ComboBox + LS3Slider + RS3Slider + OUT3Slider + AME3CheckBox + EBS3Slider + DET3Slider + KVS3Slider + WaveForm3ComboBox + EGS3ComboBox + LS4Slider + RS4Slider + OUT4Slider + AME4CheckBox + EBS4Slider + DET4Slider + KVS4Slider + WaveForm4ComboBox + EGS4ComboBox + subcategoryLineEdit + categoryLineEdit + lbankSpinBox + progSpinBox + masterVolSpinBox + feedbackSpinBox + PModSensSpinBox + AModSensSpinBox + PModDepthSpinBox + AModDepthSpinBox + LFOSpeedSpinBox + LFODelaySpinBox + CoarseRatio1SpinBox + FineRatio1SpinBox + Freq1SpinBox + LS1SpinBox + RS1SpinBox + OUT1SpinBox + EBS1SpinBox + KVS1SpinBox + DET1SpinBox + AR1SpinBox + D1R1SpinBox + D1L1SpinBox + D2R1SpinBox + RR1SpinBox + Fix2CheckBox + Freq2SpinBox + CoarseRatio2SpinBox + FineRatio2SpinBox + LS2SpinBox + RS2SpinBox + OUT2SpinBox + EBS2SpinBox + KVS2SpinBox + DET2SpinBox + AR2SpinBox + D1R2SpinBox + D1L2SpinBox + D2R2SpinBox + RR2SpinBox + Fix3CheckBox + CoarseRatio3SpinBox + FineRatio3SpinBox + Freq3SpinBox + AR3SpinBox + D1R3SpinBox + D1L3SpinBox + D2R3SpinBox + RR3SpinBox + LS3SpinBox + RS3SpinBox + OUT3SpinBox + EBS3SpinBox + KVS3SpinBox + DET3SpinBox + Fix4CheckBox + CoarseRatio4SpinBox + FineRatio4SpinBox + Freq4SpinBox + LS4SpinBox + RS4SpinBox + OUT4SpinBox + EBS4SpinBox + KVS4SpinBox + DET4SpinBox + AR4SpinBox + D1R4SpinBox + D1L4SpinBox + D2R4SpinBox + RR4SpinBox + + + + + masterVolSlider + valueChanged(int) + masterVolSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + masterVolSpinBox + valueChanged(int) + masterVolSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + feedbackSlider + valueChanged(int) + feedbackSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + feedbackSpinBox + valueChanged(int) + feedbackSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + PModSensSlider + valueChanged(int) + PModSensSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + PModSensSpinBox + valueChanged(int) + PModSensSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + AModSensSlider + valueChanged(int) + AModSensSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + AModSensSpinBox + valueChanged(int) + AModSensSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + PModDepthSpinBox + valueChanged(int) + PModDepthSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + AModDepthSpinBox + valueChanged(int) + AModDepthSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LFOSpeedSlider + valueChanged(int) + LFOSpeedSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LFOSpeedSpinBox + valueChanged(int) + LFOSpeedSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LFODelaySlider + valueChanged(int) + LFODelaySpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LFODelaySpinBox + valueChanged(int) + LFODelaySlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + PModDepthSlider + valueChanged(int) + PModDepthSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + Fix1CheckBox + toggled(bool) + Freq1SpinBox + setEnabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix1CheckBox + toggled(bool) + FineRatio1SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix1CheckBox + toggled(bool) + CoarseRatio1SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + OUT1Slider + valueChanged(int) + OUT1SpinBox + setValue(int) + + + 57 + 172 + + + 95 + 172 + + + + + OUT1SpinBox + valueChanged(int) + OUT1Slider + setValue(int) + + + 95 + 172 + + + 57 + 172 + + + + + LS1Slider + valueChanged(int) + LS1SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LS1SpinBox + valueChanged(int) + LS1Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS1Slider + valueChanged(int) + RS1SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS1SpinBox + valueChanged(int) + RS1Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET1Slider + valueChanged(int) + DET1SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET1SpinBox + valueChanged(int) + DET1Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS1Slider + valueChanged(int) + EBS1SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS1SpinBox + valueChanged(int) + EBS1Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS1Slider + valueChanged(int) + KVS1SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS1SpinBox + valueChanged(int) + KVS1Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + Fix2CheckBox + toggled(bool) + Freq2SpinBox + setEnabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix2CheckBox + toggled(bool) + FineRatio2SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix2CheckBox + toggled(bool) + CoarseRatio2SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + OUT2SpinBox + valueChanged(int) + OUT2Slider + setValue(int) + + + 95 + 172 + + + 57 + 172 + + + + + LS2Slider + valueChanged(int) + LS2SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LS2SpinBox + valueChanged(int) + LS2Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS2Slider + valueChanged(int) + RS2SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS2SpinBox + valueChanged(int) + RS2Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET2Slider + valueChanged(int) + DET2SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET2SpinBox + valueChanged(int) + DET2Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS2SpinBox + valueChanged(int) + EBS2Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS2Slider + valueChanged(int) + EBS2SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS2Slider + valueChanged(int) + KVS2SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS2SpinBox + valueChanged(int) + KVS2Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + Fix3CheckBox + toggled(bool) + Freq3SpinBox + setEnabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix3CheckBox + toggled(bool) + FineRatio3SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix3CheckBox + toggled(bool) + CoarseRatio3SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + OUT3Slider + valueChanged(int) + OUT3SpinBox + setValue(int) + + + 57 + 172 + + + 82 + 172 + + + + + OUT3SpinBox + valueChanged(int) + OUT3Slider + setValue(int) + + + 110 + 172 + + + 60 + 172 + + + + + LS3Slider + valueChanged(int) + LS3SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LS3SpinBox + valueChanged(int) + LS3Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS3Slider + valueChanged(int) + RS3SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS3SpinBox + valueChanged(int) + RS3Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET3Slider + valueChanged(int) + DET3SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET3SpinBox + valueChanged(int) + DET3Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS3Slider + valueChanged(int) + EBS3SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS3SpinBox + valueChanged(int) + EBS3Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS3Slider + valueChanged(int) + KVS3SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS3SpinBox + valueChanged(int) + KVS3Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + Fix4CheckBox + toggled(bool) + Freq4SpinBox + setEnabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix4CheckBox + toggled(bool) + FineRatio4SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + Fix4CheckBox + toggled(bool) + CoarseRatio4SpinBox + setDisabled(bool) + + + 110 + 172 + + + 110 + 172 + + + + + OUT4Slider + valueChanged(int) + OUT4SpinBox + setValue(int) + + + 55 + 172 + + + 84 + 172 + + + + + OUT4SpinBox + valueChanged(int) + OUT4Slider + setValue(int) + + + 110 + 172 + + + 56 + 172 + + + + + LS4Slider + valueChanged(int) + LS4SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + LS4SpinBox + valueChanged(int) + LS4Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS4Slider + valueChanged(int) + RS4SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + RS4SpinBox + valueChanged(int) + RS4Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET4Slider + valueChanged(int) + DET4SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + DET4SpinBox + valueChanged(int) + DET4Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS4Slider + valueChanged(int) + EBS4SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + EBS4SpinBox + valueChanged(int) + EBS4Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS4Slider + valueChanged(int) + KVS4SpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + KVS4SpinBox + valueChanged(int) + KVS4Slider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + redSlider + valueChanged(int) + redSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + redSpinBox + valueChanged(int) + redSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + greenSlider + valueChanged(int) + greenSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + greenSpinBox + valueChanged(int) + greenSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + blueSlider + valueChanged(int) + blueSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + blueSpinBox + valueChanged(int) + blueSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + fcVolumeSlider + valueChanged(int) + fcVolumeSpinBox + setValue(int) + + + 66 + 155 + + + 102 + 155 + + + + + fcVolumeSpinBox + valueChanged(int) + fcVolumeSlider + setValue(int) + + + 102 + 155 + + + 66 + 155 + + + + + fcPitchSlider + valueChanged(int) + fcPitchSpinBox + setValue(int) + + + 66 + 159 + + + 102 + 159 + + + + + fcPitchSpinBox + valueChanged(int) + fcPitchSlider + setValue(int) + + + 102 + 159 + + + 66 + 159 + + + + + fcAmplitudeSpinBox + valueChanged(int) + fcAmplitudeSlider + setValue(int) + + + 102 + 163 + + + 66 + 163 + + + + + fcAmplitudeSlider + valueChanged(int) + fcAmplitudeSpinBox + setValue(int) + + + 66 + 163 + + + 102 + 163 + + + + + transposeSlider + valueChanged(int) + transposeSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + transposeSpinBox + valueChanged(int) + transposeSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + globalDetuneSpinBox + valueChanged(int) + globalDetuneSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + globalDetuneSlider + valueChanged(int) + globalDetuneSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + pitchBendRangeSlider + valueChanged(int) + pitchBendRangeSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + pitchBendRangeSpinBox + valueChanged(int) + pitchBendRangeSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + reverbSlider + valueChanged(int) + reverbSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + reverbSpinBox + valueChanged(int) + reverbSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + PortamentoTimeSlider + valueChanged(int) + PortamentoTimeSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + PortamentoTimeSpinBox + valueChanged(int) + PortamentoTimeSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + mwPitchSlider + valueChanged(int) + mwPitchSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + mwAmplitudeSpinBox + valueChanged(int) + mwAmplitudeSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + mwAmplitudeSlider + valueChanged(int) + mwAmplitudeSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + mwPitchSpinBox + valueChanged(int) + mwPitchSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcPitchSlider + valueChanged(int) + bcPitchSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcAmplitudeSlider + valueChanged(int) + bcAmplitudeSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcPitchBiasSlider + valueChanged(int) + bcPitchBiasSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcEgBiasSlider + valueChanged(int) + bcEgBiasSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcPitchSpinBox + valueChanged(int) + bcPitchSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcEgBiasSpinBox + valueChanged(int) + bcEgBiasSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atPitchSlider + valueChanged(int) + atPitchSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atAmplitudeSpinBox + valueChanged(int) + atAmplitudeSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atAmplitudeSlider + valueChanged(int) + atAmplitudeSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atPitchBiasSlider + valueChanged(int) + atPitchBiasSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atPitchBiasSpinBox + valueChanged(int) + atPitchBiasSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atEgBiasSlider + valueChanged(int) + atEgBiasSpinBox + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atPitchSpinBox + valueChanged(int) + atPitchSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + atEgBiasSpinBox + valueChanged(int) + atEgBiasSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcPitchSpinBox + valueChanged(int) + bcPitchSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcAmplitudeSpinBox + valueChanged(int) + bcAmplitudeSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcPitchBiasSpinBox + valueChanged(int) + bcPitchBiasSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + bcEgBiasSpinBox + valueChanged(int) + bcEgBiasSlider + setValue(int) + + + 110 + 172 + + + 110 + 172 + + + + + OUT2Slider + valueChanged(int) + OUT2SpinBox + setValue(int) + + + 53 + 172 + + + 70 + 172 + + + + + presetLineEdit + textChanged(QString) + presetNameLabel + setText(QString) + + + 483 + 165 + + + 473 + 56 + + + + +
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 +#include + +//----------------------------------------------------------- +// 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::iterator iB=_subcategory->_presetVector.begin(); + std::vector::iterator iE=_subcategory->_presetVector.end(); + std::vector::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 pv=_subcategory->_presetVector; + std::vector::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 sv=_category->_subcategoryVector; + std::vector::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::iterator + iB=_category->_subcategoryVector.begin(); + std::vector::iterator + iE=_category->_subcategoryVector.end(); + std::vector::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::iterator iB=_set->_categoryVector.begin(); + std::vector::iterator iE=_set->_categoryVector.end(); + std::vector::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; ksensitivity.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::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::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::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::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::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::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::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::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; istrTag(s, (sensitivity.ampOn[i]==true? "on":"off")); + } + for(int i=0; iintTag(s, sensitivity.egBias[i]); + } + for(int i=0; iintTag(s, sensitivity.keyVelocity[i]); + } + xml->etag("sensitivity"); + //frequency + xml->tag("frequency"); + for(int i=0; ifloatTag(s, frequency[i].ratio); + } + for(int i=0; istrTag(s, (frequency[i].isFix==true? "yes":"no")); + } + for(int i=0; ifloatTag(s, frequency[i].freq); + } + xml->etag("frequency"); + //oscWave + for(int i=0; istrTag(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; iintTag(s, detune[i]); + } + //eg + xml->tag("eg"); + for(int i=0; iintTag(s, eg[i].ar); + } + for(int i=0; iintTag(s, eg[i].d1r); + } + for(int i=0; iintTag(s, eg[i].d1l); + } + for(int i=0; iintTag(s, eg[i].d2r); + } + for(int i=0; iintTag(s, eg[i].rr); + } + for(int i=0; istrTag(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; iintTag(s, outLevel[i]); + } + //scaling + xml->tag("scaling"); + for(int i=0; iintTag(s, scaling.rate[i]); + } + for(int i=0; iintTag(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::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 + +#include +#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 _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 _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 _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 Binary files /dev/null and b/muse/synti/deicsonze/pics/SHold.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo1.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo2.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo3.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo4.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo5.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo6.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo7.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/algo8.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/sawUp.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/square.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/triangl.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave1.png 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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave2.png 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] (x2*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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave3.png 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] (x2*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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave4.png 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] (x2*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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave5.png 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] (x2*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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave6.png 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] (x2*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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave7.png 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] (x2*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 Binary files /dev/null and b/muse/synti/deicsonze/pics/wave8.png 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 +#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 @@ + + + + + FLUIDGuiBase + + + + 0 + 0 + 318 + 228 + + + + Form1 + + + + 8 + + + 6 + + + + + Soundfont + + + + + + + 0 + + + 6 + + + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 230 + 20 + + + + + + + + 0 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + Load + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + + + + + + 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 +#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; iclear(); //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; isignalsBlocked(); + 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; isetText(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::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::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::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::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 + +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 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 @@ + + + + + FLUIDSynthGuiBase + + + + 0 + 0 + 656 + 514 + + + + FLUID Synth + + + + + + + 8 + + + 6 + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 8 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Loaded Soundfonts</span></p></body></html> + + + Qt::AutoText + + + Qt::AlignHCenter + + + + + + + 2 + + + true + + + + 0 + + + + + 1 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 8 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Channel Setup</span></p></body></html> + + + Qt::AlignHCenter + + + + + + + 3 + + + true + + + + 0 + + + + + 1 + + + + + 2 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 8 + + + 6 + + + + + Chorus + + + + + + + 0 + + + 6 + + + + + Number + + + Qt::AlignCenter + + + + + + + 127 + + + + + + + Type + + + Qt::AlignCenter + + + + + + + + Sine + + + + + Triangle + + + + + + + + + + 0 + + + 6 + + + + + Speed + + + Qt::AlignCenter + + + + + + + 16383 + + + 16 + + + 1638 + + + Qt::Horizontal + + + 1638 + + + + + + + + + 0 + + + 6 + + + + + Depth + + + Qt::AlignCenter + + + + + + + 16383 + + + 16 + + + 1638 + + + Qt::Horizontal + + + 1638 + + + + + + + + + 0 + + + 6 + + + + + Level + + + Qt::AlignCenter + + + + + + + 16383 + + + 16 + + + 1638 + + + Qt::Horizontal + + + 1638 + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 8 + + + 6 + + + + + 0 + + + 6 + + + + + Load + + + + + + + false + + + Delete + + + + + + + Dump Info + + + + + + + + + + + + + + + + 8 + + + 6 + + + + + <html><head><meta name="qrichtext" content="1" /></head><body style=" white-space: pre-wrap; font-family:Sans Serif; font-weight:400; font-style:normal; text-decoration:none;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Gain</p></body></html> + + + + + + + 0 + + + 127 + + + 5 + + + 13 + + + true + + + Qt::Horizontal + + + 7 + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 8 + + + 6 + + + + + Reverb + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + Room Size + + + Qt::AlignCenter + + + + + + + Damping + + + Qt::AlignCenter + + + + + + + Width + + + Qt::AlignCenter + + + + + + + Level + + + Qt::AlignCenter + + + + + + + + + 0 + + + 6 + + + + + 16383 + + + 16 + + + 1638 + + + Qt::Horizontal + + + 1638 + + + + + + + 16383 + + + 16 + + + 1638 + + + Qt::Horizontal + + + 1638 + + + + + + + 16383 + + + 16 + + + 1638 + + + Qt::Horizontal + + + 1638 + + + + + + + 16383 + + + 16 + + + 1638 + + + Qt::Horizontal + + + 1638 + + + + + + + + + + + + 11 + 36 + 260 + 17 + + + + + + + 11 + 59 + 260 + 17 + + + + + + + 11 + 82 + 260 + 17 + + + + + + + 11 + 105 + 260 + 17 + + + + + + + + + + + + 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 +#include + + +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; ishow(); + 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::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::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::const_iterator it =stack.begin(); it!=stack.end(); it++) { + *chptr = it->extid; + chptr++; + } + + //External id:s & preset for all channels: + for(int i=0; iwriteEvent(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::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::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::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::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::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; iget_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::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 +// #include +#include +#include +#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 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 + +//--------------------------------------------------------- +// 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 + +//--------------------------------------------------------- +// 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::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 +#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 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 +#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 @@ + + + + + OrganGuiBase + + + + 0 + 0 + 534 + 366 + + + + + 7 + 5 + 0 + 0 + + + + MusE: Organ + + + + + 5 + 162 + 252 + 199 + + + + + 7 + 7 + 0 + 0 + + + + Drawbars + + + + 6 + + + 2 + + + + + 16' + + + + + + + 4' + + + + + + + 2 2/3' + + + + + + + 2' + + + + + + + 5 1/3' + + + + + + + 8' + + + + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + + 7 + 0 + 0 + 0 + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + 0 + + + -960 + + + + + + + 0 + + + -960 + + + 10 + + + + + + + 0 + + + -960 + + + 10 + + + + + + + 0 + + + -960 + + + 10 + + + + + + + 0 + + + -960 + + + 10 + + + + + + + 0 + + + -960 + + + 10 + + + + + + + + + 263 + 5 + 266 + 151 + + + + + 7 + 7 + 0 + 0 + + + + Envelope Lo + + + Qt::AlignLeading + + + + 11 + + + 2 + + + + + Attack + + + + + + + Decay + + + + + + + Sustain + + + + + + + Release + + + + + + + + 7 + 0 + 0 + 0 + + + + + 80 + 0 + + + + 500 + + + 1 + + + Qt::Horizontal + + + 50 + + + + + + + 5000 + + + 1 + + + Qt::Horizontal + + + 500 + + + + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + 500 + + + 1 + + + Qt::Horizontal + + + 50 + + + + + + + + 1 + 0 + 0 + 0 + + + + ms + + + 500 + + + + + + + + 1 + 0 + 0 + 0 + + + + ms + + + 5000 + + + + + + + + 1 + 0 + 0 + 0 + + + + cB + + + 0 + + + -960 + + + 0 + + + + + + + + 1 + 0 + 0 + 0 + + + + ms + + + 500 + + + + + + + + + 0 + + + 6 + + + + + + 7 + 5 + 0 + 0 + + + + + + 48 + 50 + false + false + false + false + + + + O-1 + + + Qt::AlignCenter + + + + + + + + 7 + 7 + 0 + 0 + + + + Oscillator + + + + 11 + + + 2 + + + + + + 5 + 1 + 0 + 0 + + + + Brass + + + + + + + + 5 + 1 + 0 + 0 + + + + Reed + + + + + + + + 5 + 1 + 0 + 0 + + + + Flute + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 20 + + + + + + + + Velocity + + + + + + + + + + + + 263 + 162 + 266 + 199 + + + + + 7 + 7 + 0 + 0 + + + + Envelope Hi + + + + 8 + + + 6 + + + + + 500 + + + 1 + + + Qt::Horizontal + + + 50 + + + + + + + Sustain + + + + + + + Release + + + + + + + + 5 + 0 + 0 + 0 + + + + ms + + + 500 + + + + + + + + 5 + 0 + 0 + 0 + + + + cB + + + 0 + + + -960 + + + + + + + + 5 + 0 + 0 + 0 + + + + ms + + + 5000 + + + + + + + + 7 + 0 + 0 + 0 + + + + 500 + + + 1 + + + Qt::Horizontal + + + 50 + + + + + + + + 5 + 0 + 0 + 0 + + + + ms + + + 500 + + + + + + + 5000 + + + 1 + + + Qt::Horizontal + + + 500 + + + + + + + -960 + + + 0 + + + 1 + + + Qt::Horizontal + + + 10 + + + + + + + + 5 + 4 + 0 + 0 + + + + Attack + + + + + + + Decay + + + + + + + + + + p1 + p3 + p2 + p4 + p5 + p6 + p7 + p8 + p9 + p10 + p11 + p12 + p13 + p14 + sw1 + sw2 + sw3 + + + + 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 +#include + +#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 , (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 , (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 +#include + +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; idata; + 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